Назад | Перейти на главную страницу

Защита всех вызовов XML-RPC с помощью базовой аутентификации HTTP, кроме одной

Я создал проект 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()

Есть два грязных способа достичь моей цели в текущей ситуации:

  1. Иметь фиктивное имя пользователя / пароль, который будет использоваться при попытке зарегистрироваться в системе.
  2. Имейте отдельное приложение Django / XML-RPC на другом URL-адресе (например, / register), которое не защищено базовой аутентификацией.

Оба они очень уродливы, так как я также хотел бы определить стандартный протокол, который будет использоваться для таких сервисов, как мой (это открытая архитектура динамического обмена).

Есть ли способ снять защиту с одного вызова XML-RPC (т. Е. Определенного запроса POST), даже если все вызовы XML-RPC через / RPC2 защищены?

Это может звучать как сумасшедший разговор, но может ли ваша функция check_password () увидеть, что ей нужно для выполнения своей работы, и просто вернуть «ok», если цель - та, которую вы хотите снять?

Я вообще не знаю Django, поэтому возможно, что ваш check_password () даже не вызывается, если нет имени пользователя / пароля, если Django поймает это до того, как вызовет ваш код.