Я создал проект Django для смартфона, обслуживающего методы XML-RPC через HTTPS и использующего базовую аутентификацию. Все методы XML-RPC требуют имени пользователя и пароля.
Я хотел бы реализовать метод XML-RPC для обеспечения регистрации в системе.
Очевидно, что этот метод не требует имени пользователя и пароля. Ниже приведен раздел конфигурации Apache, отвечающий за базовую аутентификацию:
<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()
Есть два грязных способа достичь моей цели в текущей ситуации:
Оба они очень уродливы, так как я также хотел бы определить стандартный протокол, который будет использоваться для таких сервисов, как мой (это открытая архитектура динамического обмена).
Есть ли способ снять защиту с одного вызова XML-RPC (т. Е. Определенного запроса POST), даже если все вызовы XML-RPC через / RPC2 защищены?
Это может звучать как сумасшедший разговор, но может ли ваша функция check_password () увидеть, что ей нужно для выполнения своей работы, и просто вернуть «ok», если цель - та, которую вы хотите снять?
Я вообще не знаю Django, поэтому возможно, что ваш check_password () даже не вызывается, если нет имени пользователя / пароля, если Django поймает это до того, как вызовет ваш код.