【问题标题】:Ejabberd auth http query to django server unauthenticatedEjabberd auth http 查询到 django 服务器未经身份验证
【发布时间】:2015-10-20 14:11:06
【问题描述】:

我正在尝试使用 ejabberd_auth_http 模块在 ejabberd 服务器中进行用户身份验证。因此,为了进行身份验证,ejabberd 服务器 (http://localhost:5222) 将查询 django rest 服务器并检查用户是否存在并提供了凭据。 django服务器中的GET请求处理程序如下。

@api_view(['GET'])
@permission_classes([AllowAny])
def user_exists(request):
    try:
        User.objects.get(username=request.query_params.get("user"))
        return Response({"user_exists": True})
    except User.DoesNotExist:
        raise exceptions.NotFound(False)


@api_view(['GET'])
@permission_classes([AllowAny])
def check_password(request):
    try:
        User.objects.get(Q(......))
        return Response({"check_password": True})
    except User.DoesNotExist:
        raise exceptions.AuthenticationFailed(False)

每当我尝试登录 ejabberd 网络管理员 (http://localhost:5280/admin/) 时,它都会向休息服务器发出查询,但休息服务器返回未经授权的 (HTTP 401) 响应。以下是 django 服务器端的响应日志。

"GET /ejabberd/check_password?user=772&server=192.168.1.102&pass=password HTTP/1.1" 401 59

但是,如果我在 浏览器 中使用生成的 URL http://localhost:8000//ejabberd/check_password?user=772&server=192.168.1.102&pass=password,则会收到 HTTP 响应 200。

django-rest 是否对跨服务器查询使用了任何类型的内置保护?如果是这样,如何允许查询 ejabberd 服务器。

下面是setting.py的代码sn-p

    ALLOWED_HOSTS = []


# Application definition

INSTALLED_APPS = (
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.staticfiles',
    # Rest Framework app
    'rest_framework',
    'rest_framework.authtoken',
    # Internal Apps
    'itiData',
    'ejabberd',
)

MIDDLEWARE_CLASSES = (
    'django.middleware.common.CommonMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
)

REST_FRAMEWORK = {
    'DEFAULT_AUTHENTICATION_CLASSES': (
        'rest_framework.authentication.BasicAuthentication',
        'rest_framework.authentication.SessionAuthentication',
        'rest_framework.authentication.TokenAuthentication',

    ),
    'DEFAULT_PERMISSION_CLASSES': (
        'rest_framework.permissions.IsAuthenticated',
        'rest_framework.permissions.DjangoModelPermissions'
    )
}

【问题讨论】:

    标签: django authentication django-rest-framework ejabberd


    【解决方案1】:

    为了回答我自己的问题,我猜 ejabberd_auth_http 发送带有 url 的基本授权标头。在 django 功能视图中使用 @authentication_classes([]) 可以解决这个问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-09-08
      • 2018-10-25
      • 2019-04-24
      • 1970-01-01
      • 1970-01-01
      • 2021-05-26
      • 1970-01-01
      • 2011-11-11
      相关资源
      最近更新 更多