【问题标题】:Django token authorization - customizing obtain_jwt_token by overriding ObtainAuthToken classDjango 令牌授权 - 通过覆盖获取AuthToken 类自定义获取_jwt_token
【发布时间】:2017-07-05 08:01:44
【问题描述】:

我的目标是覆盖obtain_jwt_token,以便更好地控制过程的返回值,而在doc 中,我只发现了有关如何执行此操作的奇怪而粗略的信息:

请注意,默认的 gain_auth_token 视图显式使用 JSON 请求和响应,而不是使用默认的渲染器和解析器 您的设置中的课程。如果您需要定制版本的 获得_auth_token 视图,您可以通过覆盖 获取AuthToken 视图类,并在您的 url conf 中使用它

目前,我的尝试是这样的:

urlpatterns = [
   url(r'^api-token-auth/', my_customized_view),
]

class Foo(ObtainAuthToken):
    def post(self):
       # here goes my customized code

my_customized_view = Foo.as_view()

很可能我的代码看起来很傻,我只是在谷歌上迷失了方向。我在 Djagno 的经验很少,所以请帮助我!

【问题讨论】:

  • 我不明白你到底想做什么。也许如果你有一个更好的例子来说明你的目标和实际代码。对于 JWT,我使用 getblimp.github.io/django-rest-framework-jwt,它工作正常,并且很容易自定义 jwt 响应。
  • 如果我是对的,您正在尝试根据某些条件自定义返回令牌。随机猜测。

标签: django-rest-auth


【解决方案1】:

我刚刚经历了与我希望返回用户并允许电子邮件或用户名登录相同的理解之旅。文档并不完全清楚,但如 auth token 所述,您可以对 JWT 执行相同操作。 gain_auth_token 是ObtainAuthToken,如obtain_jwt_token 是ObtainJSONWebToken。 这是我覆盖的登录方法:

from rest_framework_jwt.settings import api_settings
from rest_framework_jwt.views import ObtainJSONWebToken

jwt_payload_handler = api_settings.JWT_PAYLOAD_HANDLER
jwt_encode_handler = api_settings.JWT_ENCODE_HANDLER
jwt_decode_handler = api_settings.JWT_DECODE_HANDLER


class LoginView(ObtainJSONWebToken):
    def post(self, request, *args, **kwargs):
        # by default attempts username / passsword combination
        response = super(LoginView, self).post(request, *args, **kwargs)
        # token = response.data['token']  # don't use this to prevent errors
        # below will return null, but not an error, if not found :)
        res = response.data
        token = res.get('token')

        # token ok, get user
        if token:
            user = jwt_decode_handler(token)  # aleady json - don't serialize
        else:  # if none, try auth by email
            req = request.data  # try and find email in request
            email = req.get('email')
            password = req.get('password')
            username = req.get('username')

            if email is None or password is None:
                return Response({'success': False, 
                                'message': 'Missing or incorrect credentials',
                                'data': req},
                                status=status.HTTP_400_BAD_REQUEST)

            # email exists in request, try to find user
            try:
                user = User.objects.get(email=email)
            except:
                return Response({'success': False, 
                                'message': 'User not found',
                                'data': req},
                                status=status.HTTP_404_NOT_FOUND)

            if not user.check_password(password):
                return Response({'success': False, 
                                'message': 'Incorrect password',
                                'data': req},
                                status=status.HTTP_403_FORBIDDEN)

            # make token from user found by email
            payload = jwt_payload_handler(user)
            token = jwt_encode_handler(payload)
            user = UserSerializer(user).data

        return Response({'success': True,
                        'message': 'Successfully logged in',
                        'token': token,
                        'user': user}, 
                        status=status.HTTP_200_OK)

您可以通过自定义 Django 的身份验证模型将默认设置更改为仅通过电子邮件检查,但我很高兴同时拥有这两个选项。

我开始创建一个 api 样板。有一个 requirements.txt 文件和一个 config.example.py 文件供任何想要拉下来查看其余部分的人使用。 https://github.com/garyburgmann/django-api-boilerplate

【讨论】:

    【解决方案2】:
    1. 在views.py文件中添加以下代码并根据需要进行自定义。
    def jwt_response_payload_handler(token, user=None, request=None):
        return {
            'token': token,
            'user': UserSerializer(user, context={'request': request}).data
        }
    

    默认为 {'token': token}

    1. 同样在你的 settings.py 文件中添加
    JWT_AUTH = {
        
        'JWT_RESPONSE_PAYLOAD_HANDLER':
            'api.user.views.jwt_response_payload_handler',
     }
    

    ('api.user.views.jwt_response_payload_handler', ) 是自定义 jwt_response_payload_handler 的路径

    更多帮助可以查看here

    【讨论】:

      猜你喜欢
      • 2018-03-25
      • 2018-06-13
      • 1970-01-01
      • 2019-03-21
      • 2016-11-29
      • 2016-11-11
      • 1970-01-01
      • 1970-01-01
      • 2017-07-11
      相关资源
      最近更新 更多