首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从django-rest-framework-simplejwt自定义JWT响应

从django-rest-framework-simplejwt自定义JWT响应
EN

Stack Overflow用户
提问于 2019-02-06 00:14:58
回答 4查看 18.9K关注 0票数 23

我将Django设置为发送JWT响应,而不是视图。我试过使用django-rest框架-simplejwt。

在这个框架中,有一个函数TokenObtainPairView.as_view()返回一对jwt。我需要用另一个Json响应返回访问令牌,而不是提供的两个令牌。

理想情况下,我想要一个包含与这个相同的访问令牌的JsonResponse:TokenObtainPairView.as_view()

我尝试创建自己的视图,如下所示。

更新:以Settings.py提供的

代码语言:javascript
复制
SIMPLE_JWT = {
    'ACCESS_TOKEN_LIFETIME': timedelta(days=1),
    'REFRESH_TOKEN_LIFETIME': timedelta(days=1),
    'ROTATE_REFRESH_TOKENS': False,
    'BLACKLIST_AFTER_ROTATION': True,

    'ALGORITHM': 'HS256',
    'SIGNING_KEY': SECRET_KEY,
    'VERIFYING_KEY': None,

    'AUTH_HEADER_TYPES': ('Bearer',),
    'USER_ID_FIELD': 'id',
    'USER_ID_CLAIM': 'user_id',

    'AUTH_TOKEN_CLASSES': ('rest_framework_simplejwt.tokens.AccessToken',),
    'TOKEN_TYPE_CLAIM': 'token_type',

    'SLIDING_TOKEN_REFRESH_EXP_CLAIM': 'refresh_exp',
    'SLIDING_TOKEN_LIFETIME': timedelta(days=1),
    'SLIDING_TOKEN_REFRESH_LIFETIME': timedelta(days=1),
}

登录URL路径

代码语言:javascript
复制
urlpatterns = [
    path('auth/', views.LoginView.as_view()),
]

我创建的LoginView

代码语言:javascript
复制
class LoginView(APIView):
    permission_classes = (AllowAny,)

    def post(self, request, *args, **kwargs):
        username = request.data['username']
        password = request.data['password']

        user = authenticate(username=username, password=password)

        if user is not None:
            payload = {
                'user_id': user.id,
                'exp': datetime.now(),
                'token_type': 'access'
            }

            user = {
                'user': username,
                'email': user.email,
                'time': datetime.now().time(),
                'userType': 10
            }

            token = jwt.encode(payload, SECRET_KEY).decode('utf-8')
            return JsonResponse({'success': 'true', 'token': token, 'user': user})

        else:
            return JsonResponse({'success': 'false', 'msg': 'The credentials provided are invalid.'})

框架提供的模式。

代码语言:javascript
复制
urlpatterns = [
...
path('token/', TokenObtainPairView.as_view()),
...
]

它返回此令牌。

eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ0b2tlbl90eXBlIjoiYWNjZXNzIiwiZXhwIjoxNTQ5NDk3NDQ2LCJqdGkiOiI3YmU4YzkzODE4MWI0MmJlYTFjNDUyNDhkNDZmMzUxYSIsInVzZXJfaWQiOiIwIn0.xvfdrWf26g4FZL2zx3nJPi7tjU6QxPyBjq-vh1fT0Xs eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ0b2tlbl90eXBlIjoicmVmcmVzaCIsImV4cCI6MTU0OTQ5NzQ0NiwianRpIjoiOTNhYzkxMjU5NmZkNDYzYjg2OGQ0ZTM2ZjZkMmJhODciLCJ1c2VyX2lkIjoiMCJ9.dOuyuFuMjkVIRI2_UcXT8_alCjlXNaiRJx8ehQDIBCg

如果你去https://jwt.io/,你会看到返回了什么

EN

回答 4

Stack Overflow用户

发布于 2019-04-26 01:48:11

  • ,例如,:要通过添加用户名和组来自定义simpleJWT响应,

  1. validate中重写TokenObtainPairSerializer方法
代码语言:javascript
复制
# project/views.py

from rest_framework_simplejwt.serializers import TokenObtainPairSerializer
from rest_framework_simplejwt.views import TokenObtainPairView


class MyTokenObtainPairSerializer(TokenObtainPairSerializer):
    def validate(self, attrs):
        data = super().validate(attrs)
        refresh = self.get_token(self.user)

        # Add extra responses here
        data['username'] = self.user.username
        data['groups'] = self.user.groups.values_list('name', flat=True)
        return data


class MyTokenObtainPairView(TokenObtainPairView):
    serializer_class = MyTokenObtainPairSerializer
  1. 用自定义视图替换登录视图
代码语言:javascript
复制
# project/urls.py

from .views import MyTokenObtainPairView

urlpatterns = [
    # path('token/', TokenObtainPairView.as_view(), name='token_obtain_pair'),
    path('token/', MyTokenObtainPairView.as_view(), name='token_obtain_pair'),
]

引用: SimpleJWT自述和源代码如下:

票数 48
EN

Stack Overflow用户

发布于 2019-11-25 21:08:22

来自django-rest-框架-simplejwt自述的非常清晰的方法如下所示

例如,我有用户应用程序,我的自定义用户模型驻留在其中。遵循下面的序列化程序和视图代码示例。

用户/序列化器.:

代码语言:javascript
复制
from rest_framework_simplejwt.serializers import TokenObtainPairSerializer


class MyTokenObtainPairSerializer(TokenObtainPairSerializer):
    @classmethod
    def get_token(cls, user):
        token = super().get_token(user)

        # Add custom claims
        token['name'] = user.name
        # Add more custom fields from your custom user model, If you have a
        # custom user model.
        # ...

        return token

用户/views.py:

代码语言:javascript
复制
from rest_framework_simplejwt.views import TokenObtainPairView


class MyTokenObtainPairView(TokenObtainPairView):
    serializer_class = MyTokenObtainPairSerializer

然后,在项目的urls.py中注册上面的视图,如下所示取代原始的TokenObtainPairView

代码语言:javascript
复制
from users.views import MyTokenObtainPairView

urlpatterns = [
    ..
    # Simple JWT token urls
    # path('api/token/', TokenObtainPairView.as_view(),
    #      name='token_obtain_pair'),
    path('api/token/', CustomTokenObtainPairView.as_view(),
         name='token_obtain_pair')
    ..
]

现在获取访问令牌并在jwt.io上解码它

票数 12
EN

Stack Overflow用户

发布于 2019-04-26 03:12:14

自定义令牌响应如下:

代码语言:javascript
复制
from rest_framework_simplejwt.tokens import RefreshToken
    
    
    class LoginView(APIView):
        permission_classes = (AllowAny,)
     
        def post(self, request, *args, **kwargs):
            # ...
    
            # Get user token, include refresh and access token
            token = RefreshToken.for_user(user) 
    
            # Serializer token if it is not correct JSON format ^^
        
            return JsonResponse({'success': 'true', 'token': token, 'user': user})
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54544978

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档