我为智能手机设置了一个 Django 项目,通过 HTTPS 提供 XML-RPC 方法并使用基本身份验证。所有 XML-RPC 方法都需要用户名和密码。
我想实现一个 XML-RPC 方法来为系统提供注册。
显然,这种方法不需要用户名和密码。以下是负责基本身份验证的 Apache conf 部分:
<Location /RPC2>
AuthType Basic
AuthName "Login Required"
Require valid-user
AuthBasicProvider wsgi
WSGIAuthUserScript /path/to/auth.wsgi
</Location>
这是我的auth.wsgi:
import os
import sys
sys.stdout = sys.stderr
sys.path.append('/path/to/project')
os.environ['DJANGO_SETTINGS_MODULE'] = 'project.settings'
from django.contrib.auth.models import User
from django import db
def check_password(environ, user, password):
"""
Authenticates apache/mod_wsgi against Django's auth database.
"""
db.reset_queries()
kwargs = {'username': user, 'is_active': True}
try:
# checks that the username is valid
try:
user = User.objects.get(**kwargs)
except User.DoesNotExist:
return None
# verifies that the password is valid for the user
if user.check_password(password):
return True
else:
return False
finally:
db.connection.close()
在目前的情况下,有两种肮脏的方法可以实现我的目标:
- 尝试注册系统时使用虚拟用户名/密码
- 在另一个不受基本身份验证保护的 URL(即:/register)上有一个单独的 Django/XML-RPC 应用程序
它们都很丑陋,因为我还想定义一个标准协议用于像我的服务(这是一个开放的动态拼车架构)
即使 /RPC2 上的所有 XML-RPC 调用都受到保护,是否有办法取消保护单个 XML-RPC 调用(即定义的 POST 请求)?
答案1
这听起来可能有点疯狂,但是您的 check_password() 函数是否可以看到它需要做什么才能完成其工作,并且如果目标是您希望取消保护的目标,则只返回“ok”?
我完全不了解 Django,所以如果没有用户名/密码,并且 Django 在调用你的代码之前捕获到这一点,那么你的 check_password() 甚至可能不会被调用。