Django JWT auth:如何获取用户数据?
Posted
技术标签:
【中文标题】Django JWT auth:如何获取用户数据?【英文标题】:Django JWT auth: How to get user data? 【发布时间】:2017-08-12 14:38:06 【问题描述】:我正在拼命地了解如何在 Django 中使用 JWT 身份验证。
此页面说明如何根据用户名和密码获取令牌:
http://getblimp.github.io/django-rest-framework-jwt/
$ curl -X POST -H "Content-Type: application/json" -d '"username":"admin","password":"password123"' http://localhost:8000/api-token-auth/
Now in order to access protected api urls you must include the Authorization: JWT <your_token> header.
1) 如何从服务器获取“已登录”用户的用户详细信息(ID、电子邮件..)?如果我使用基于会话的身份验证,我只会序列化并在它已登录时返回 request.user
。我不明白如果没有任何与身份验证相关的持久性,服务器将如何知道谁是谁。
2) 我什至不明白该页面中描述的过程如何安全。为什么攻击者不能直接劫持令牌并做他想做的事?据我了解,我只是得到一个令牌,然后在每个请求中发回相同的令牌。这甚至是真正的 JWT 吗?
【问题讨论】:
【参考方案1】:您将典型的 Django 身份验证机制与 JWT 结合使用。
您使用用户名和密码发布并取回令牌。您的身份验证视图需要具有以下权限类:
from rest_framework.views import APIView
class Authenticate(APIView):
permission_classes = (AllowAny,)
下次您发送令牌时,它会通过这里:
REST_FRAMEWORK =
'DEFAULT_PERMISSION_CLASSES': (
'rest_framework.permissions.IsAuthenticated',
),
'DEFAULT_AUTHENTICATION_CLASSES': (
'rest_framework.authentication.SessionAuthentication',
'rest_framework.authentication.BasicAuthentication',
'rest_framework_jwt.authentication.JSONWebTokenAuthentication',
),
认证类设置request.user
,你可以照常使用
2) 我什至不明白该页面中描述的过程如何安全。为什么攻击者不能直接劫持令牌并做他想做的事?据我了解,我只是得到一个令牌,然后在每个请求中发回相同的令牌。这甚至是真正的 JWT 吗?
您绝对必须研究 JWT 刷新令牌机制。令牌通常是短暂的,我认为默认是 5 分钟。
【讨论】:
可靠的答案。使用令牌身份验证时,仅通过 https 使您的 api 可用也是很重要的。以上是关于Django JWT auth:如何获取用户数据?的主要内容,如果未能解决你的问题,请参考以下文章
当他从所有浏览器(Django-rest-auth,JWT)更改密码时如何注销用户?
Django JWT Auth 和 Vue:如何检查用户是不是登录 Vue?