使用 HTTP 基本身份验证保护所有 XML-RPC 调用,但有一个除外

使用 HTTP 基本身份验证保护所有 XML-RPC 调用,但有一个除外

我为智能手机设置了一个 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()

在目前的情况下,有两种肮脏的方法可以实现我的目标:

  1. 尝试注册系统时使用虚拟用户名/密码
  2. 在另一个不受基本身份验证保护的 URL(即:/register)上有一个单独的 Django/XML-RPC 应用程序

它们都很丑陋,因为我还想定义一个标准协议用于像我的服务(这是一个开放的动态拼车架构)

即使 /RPC2 上的所有 XML-RPC 调用都受到保护,是否有办法取消保护单个 XML-RPC 调用(即定义的 POST 请求)?

答案1

这听起来可能有点疯狂,但是您的 check_password() 函数是否可以看到它需要做什么才能完成其工作,并且如果目标是您希望取消保护的目标,则只返回“ok”?

我完全不了解 Django,所以如果没有用户名/密码,并且 Django 在调用你的代码之前捕获到这一点,那么你的 check_password() 甚至可能不会被调用。

相关内容