django管理页面和JWT

Mic*_*vin 9 django jwt

我们使用django-rest-framework和django-rest-framework-jwt进行身份验证,除了django管理页面之外,它可以在任何地方使用ip:port/admin/.那仍然需要用户名和密码.

是否有设置或方法绕过它,以便它识别JWT?

/admin/页面是否总是需要使用名称/密码?我认为内置令牌auth可以使用它.

jwt是settings.py文件中唯一的auth设置.会话身份验证不再存在.

小智 6

问题是 Django 不知道 djangorestframework-jwt,而只知道 djangorestframework 本身。对我有用的解决方案是创建一个简单的中间件,利用 djangorestframework-jwt 的身份验证

在设置.py中:

MIDDLEWARE = [
    # others
    'myapp.middleware.jwt_auth_middleware',
]
Run Code Online (Sandbox Code Playgroud)

然后在我的 myapp/middleware.py 中

from rest_framework_jwt.authentication import JSONWebTokenAuthentication
from django.contrib.auth.models import AnonymousUser
from rest_framework import exceptions

def jwt_auth_middleware(get_response):
    """Sets the user object from a JWT header"""
    def middleware(request):
        try:
            authenticated = JSONWebTokenAuthentication().authenticate(request)
            if authenticated:
                request.user = authenticated[0]
            else:
                request.user = AnonymousUser
        except exceptions.AuthenticationFailed as err:
            print(err)
            request.user = AnonymousUser

        response = get_response(request)

        return response

    return middleware
Run Code Online (Sandbox Code Playgroud)

重要提示: 这是一种幼稚的方法,不应在生产中运行,因此我只启用此中间件if DEBUG。如果在生产环境中运行,您可能应该像内置模块一样缓存并延迟评估用户django.contrib.auth


小智 -1

问题可能不在于您使用的身份验证方法。如果您自定义User模型,该create_superuser方法可能不会将is_active用户实例详细信息中的标志更新为True. 这种情况下 django 身份验证后端(如果您使用ModelBackend)可以识别用户不活跃并且不允许进行身份验证。is_active简单检查 - 只需查看您创建的超级用户字段的值即可。如果是False,请手动更新为True,然后尝试登录。如果这是您问题的原因,您需要重写create_superuserUserManagercreate_user类的方法。