django管理页面和JWT

时间:2018-04-05 18:24:21

标签: django jwt

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

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

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

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

2 个答案:

答案 0 :(得分:1)

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

在settings.py中:

MIDDLEWARE = [
    # others
    'myapp.middleware.jwt_auth_middleware',
]

然后在我的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

重要提示: 这是一种幼稚的方法,您不应在生产中运行,因此我仅启用此中间件if DEBUG。如果在生产环境中运行,则应该按照内置django.contrib.auth模块的操作来缓存并懒惰地评估用户。

答案 1 :(得分:-1)

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