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?

Django的JWT机制工作流程

如何在 Django 的单个 API 中获取访问令牌和刷新令牌(rest_framework_jwt)

升级后的 jwt-auth - 从请求令牌中获取用户

可以使用 Auth0 JWT 令牌向 Django 后端发送 POST 请求吗?