Django REST 框架、JWT 和 request.session

Posted

技术标签:

【中文标题】Django REST 框架、JWT 和 request.session【英文标题】:Django rest framework, JWT and request.session 【发布时间】:2015-08-13 07:56:38 【问题描述】:

我使用 Django REST 框架和 JWT 进行身份验证,一切正常,但是...... 我需要在登录时将有关用户的信息保存在会话变量中,我真的不知道在哪里可以做 request.session['mydata'] = plop

我试过了:

def jwt_response_payload_handler(token, user=None, request=None):
  serializedUser = UserSerializer(user).data
  request.session['mydata'] = serializedUser.mydata
  return 
    'token': token,
    'user': serializedUser
  

但它不起作用......

有什么想法吗?

【问题讨论】:

【参考方案1】:

request.session 由 Django's session framework 管理,这需要使用会话 cookie 并且是 SessionAuthentication 的强大功能。

JWT 完全独立于会话身份验证,并且不提供在令牌上存储任意数据的方法。

【讨论】:

所以如果我的所有数据都依赖于用户表中的“office_id”,那么使用 JWT 我必须在其他请求之前请求我的用户表? 我相信 JWT 已经引用了 User,但是是的,您必须这样做。【参考方案2】:

试试这个

def jwt_response_payload_handler(token, user=None, request=None):
    return 
        'token': token,
        'user': UserSerializer(
            user,
            context=
                'request': request
            ,
        ).data
    

您添加到 UserSerializer 的任何字段都将与令牌一起包含在响应中。

然后您可以使用它将信息与令牌一起存储在本地存储中,以便您的 SPA 可以使用它,而无需每次都进行单独的调用。

与文档的唯一区别是添加了context='request': request,,这可能是自编写 JWT 文档以来 DRF 发生变化的结果。

【讨论】:

以上是关于Django REST 框架、JWT 和 request.session的主要内容,如果未能解决你的问题,请参考以下文章

Django Rest 框架 JWT

ANDROID VOLLEY + JWT TOKEN 认证 + DJANGO REST 框架

在 Django REST 框架中使用 JWT 时,刷新令牌和访问令牌存储在哪里?

使用 Django REST 框架进行 JWT 身份验证

Django rest 框架 JWT 和自定义身份验证后端

Django rest框架登录后获取JWT令牌