【问题标题】:django admin page and JWTdjango 管理页面和 JWT
【发布时间】:2018-09-15 16:06:49
【问题描述】:

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

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

/admin/ 页面是否总是需要使用名称/密码?我认为内置令牌身份验证适用于此。

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

【问题讨论】:

  • 如果我可能忽略了一些简单的事情,我深表歉意。我已经使用扩展将 JWT 直接插入到请求标头中,并且适用于除 /admin/ 之外的所有 url,它适用于 /schemaview/ 甚至是 rest-framework api 视图。
  • 嗨,有同样的问题,在这里寻找同样的解决方案。在此期间你能弄清楚一些事情吗?
  • 我还没弄明白。目前对我来说这不是一个高优先级的任务,但在不久的将来我可能需要一些不错的任务。

标签: django jwt


【解决方案1】:

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

在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 模块那样缓存并延迟评估用户。

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 我一直在使用活跃用户。使用 chrome 修改请求,我将令牌添加到标题中。我可以访问除 /admin/ 页面之外的所有内容。现在已经有一段时间很好地处理这个问题了。我会仔细检查和验证
    最近更新 更多