Django JWT获取用户信息

时间:2018-05-18 06:52:53

标签: django django-rest-framework jwt

我正在使用Django JWT身份验证和Django Rest Framework 检索令牌后如何获取登录用户的用户信息?

4 个答案:

答案 0 :(得分:2)

通过阅读DRF Authentication上的文档和@neverwalkaloner在评论中提到的文档,我们看到我们可以通过使用以下内容访问视图中已登录用户的django.contrib.auth.User实例request.user属性。

阅读推荐的DRF JWT模块的文档:

我没有找到任何证据表明他们更改/覆盖了访问登录用户的实例信息的方法。

答案 1 :(得分:0)

只需检查您的应用设置文件,无论您是否指定了jwt身份验证后端。 如果它提到那里,如果你正在使用用户模型(换句话说,django.contrib.auth.models.User)request.user将工作

如果您使用自己的自定义用户模型

from django.conf import settings
from rest_framework import authentication
from rest_framework import exceptions
from rest_framework.authentication import get_authorization_header
import CustomUser # just import your model here
import jwt

class JWTAuthentication(authentication.BaseAuthentication):
    def authenticate(self, request): # it will return user object
        try:
            token = get_authorization_header(request).decode('utf-8')
            if token is None or token == "null" or token.strip() == "":
                raise exceptions.AuthenticationFailed('Authorization Header or Token is missing on Request Headers')
            print(token)
            decoded = jwt.decode(token, settings.SECRET_KEY)
            username = decoded['username']
            user_obj = CustomUser.objects.get(username=username)
        except jwt.ExpiredSignature :
            raise exceptions.AuthenticationFailed('Token Expired, Please Login')
        except jwt.DecodeError :
            raise exceptions.AuthenticationFailed('Token Modified by thirdparty')
        except jwt.InvalidTokenError:
            raise exceptions.AuthenticationFailed('Invalid Token')
        except Exception as e:
            raise exceptions.AuthenticationFailed(e)
        return (user_obj, None)

    def get_user(self, userid):
        try:
            return CustomUser.objects.get(pk=userid)
        except Exception as e:
            return None

并在您的应用中添加以下设置

REST_FRAMEWORK = {
    'DEFAULT_AUTHENTICATION_CLASSES': (
        'path_to_custom_authentication_backend',
        ....
    )
}

现在,在每个视图/视图集中,您都可以使用request.user

访问用户对象

答案 2 :(得分:0)

如果您熟悉django rest jwt,您可能会在settings.py中看到这样的配置:

JWT_AUTH = {
 .....
'JWT_RESPONSE_PAYLOAD_HANDLER':
    'rest_framework_jwt.utils.jwt_response_payload_handler',

'JWT_SECRET_KEY': SECRET_KEY,
....
}

您可以简单地创建一个方法,例如如下所示的my_custom_jwt_response_payload_handler并将地址JWT_RESPONSE_PAYLOAD_HANDLER分配给新的处理程序:

def jwt_response_payload_handler(token, user=None, request=None):

return {
    'token': token,
    'user': {
        'username': user.username, 'id': user.id,
        ...
    }
}

您可以在此响应中添加所需的任何数据。然后使用您的新处理程序修补settings.py:

JWT_AUTH = {
 .....
'JWT_RESPONSE_PAYLOAD_HANDLER':
    'localtion-to-my-own-handler-file.my_custom_jwt_response_payload_handler',
....
}

为了更好地理解,我建议阅读herejwt_response_payload_handler的原始资源和评论

答案 3 :(得分:0)

登录后,即表示您已通过Django身份验证,现在您可以在代码中的任何位置检索当前用户详细信息。

request.user

用户获得身份验证后,

请求包含用户模型的所有详细信息。否则,它将显示Anonymus用户。