我正在使用Django JWT身份验证和Django Rest Framework 检索令牌后如何获取登录用户的用户信息?
答案 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',
....
}
为了更好地理解,我建议阅读here中jwt_response_payload_handler
的原始资源和评论
答案 3 :(得分:0)
登录后,即表示您已通过Django身份验证,现在您可以在代码中的任何位置检索当前用户详细信息。
request.user
用户获得身份验证后,请求包含用户模型的所有详细信息。否则,它将显示Anonymus用户。