【问题标题】:jwt rest framework returning user id with tokenjwt REST框架返回带有令牌的用户ID
【发布时间】:2018-07-24 14:48:18
【问题描述】:

我正在使用jwt-rest-framework 进行用户身份验证,我想返回带有令牌的user_id。有一些使用Django-rest-framework时如何做的例子,所以根据这个例子我试图覆盖ObtainJSONWenToken jwt视图并做了同样的事情

from rest_framework.authtoken.models import Token
from rest_framework.response import Response
from rest_framework_jwt.views import ObtainJSONWebToken

    # Create your views here.


    class CustomObtainJSONWebToken(ObtainJSONWebToken):
        """
        Return user id with token

        """
        def post(self, request, *args, **kwargs):
            response = super(CustomObtainJSONWebToken, self).post(request, *args, **kwargs)
            token = Token.objects.get(key=response.data['token'])
            return Response({'token': token.key, 'id': token.user_id})

但是 Traceback 指向 token 它自己:

Traceback:  

File "/home/copser/.virtualenvs/iToucan-BackHand/lib/python3.5/site-packages/django/core/handlers/exception.py" in inner
  42.             response = get_response(request)

File "/home/copser/.virtualenvs/iToucan-BackHand/lib/python3.5/site-packages/django/core/handlers/base.py" in _get_response
  187.                 response = self.process_exception_by_middleware(e, request)

File "/home/copser/.virtualenvs/iToucan-BackHand/lib/python3.5/site-packages/django/core/handlers/base.py" in _get_response
  185.                 response = wrapped_callback(request, *callback_args, **callback_kwargs)

File "/usr/lib/python3.5/contextlib.py" in inner
  30.                 return func(*args, **kwds)

File "/home/copser/.virtualenvs/iToucan-BackHand/lib/python3.5/site-packages/django/views/decorators/csrf.py" in wrapped_view
  58.         return view_func(*args, **kwargs)

File "/home/copser/.virtualenvs/iToucan-BackHand/lib/python3.5/site-packages/django/views/generic/base.py" in view
  68.             return self.dispatch(request, *args, **kwargs)

File "/home/copser/.virtualenvs/iToucan-BackHand/lib/python3.5/site-packages/rest_framework/views.py" in dispatch
  489.             response = self.handle_exception(exc)

File "/home/copser/.virtualenvs/iToucan-BackHand/lib/python3.5/site-packages/rest_framework/views.py" in handle_exception
  449.             self.raise_uncaught_exception(exc)

File "/home/copser/.virtualenvs/iToucan-BackHand/lib/python3.5/site-packages/rest_framework/views.py" in dispatch
  486.             response = handler(request, *args, **kwargs)

File "/home/copser/Documents/iToucan-BackHand/iToucan/itoucan/rest_auth/views.py" in post
  15.         token = Token.objects.get(key=response.data['token'])

问题是用令牌返回user_id 的正确方法是什么,如何覆盖这个视图以便实现这一点?

【问题讨论】:

  • 您没有显示错误。显示你的错误。这只是回溯。

标签: django django-rest-framework


【解决方案1】:

您可以为 jwt 负载响应添加自定义函数:

def jwt_response_payload_handler(token, user=None, request=None):
    return {
        'token': token,
        'user': user.id
    }

并在您的 django 设置中添加:

JWT_AUTH = {
    ...
    'JWT_RESPONSE_PAYLOAD_HANDLER': 'your_path_to.jwt_response_payload_handler',
    ...
}

【讨论】:

  • 天啊,这太蹩脚了,文档对此很清楚,我对 JWT_PAYLOAD_GET_USER_ID_HANDLER 感到困惑,但这节省了一天的时间,谢谢
猜你喜欢
  • 2016-06-27
  • 1970-01-01
  • 2018-11-19
  • 2020-01-30
  • 2017-11-10
  • 2017-01-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多