简体   繁体   English

DRF 简单 jwt。 如何更改来自 TokenObtainPairView 的响应以获取访问令牌过期时间

[英]DRF simple jwt. How to change response from TokenObtainPairView to get an access token EXPIRES time

I wrote in urls:我在网址中写道:


from rest_framework_simplejwt.views import (
    TokenObtainPairView,
    TokenRefreshView,
)

urlpatterns = [
    ...
    path('api/token/', TokenObtainPairView.as_view(), name='token_obtain_pair'),
    path('api/token/refresh/', TokenRefreshView.as_view(), name='token_refresh'),
    ...
]

Then when I request api/token/, I got a json response with only access and refresh tokens.然后当我请求 api/token/ 时,我得到了一个只有访问和刷新令牌的 json 响应。
But I need to get also an access token expires time for saving it to localStorage and request to the refresh url, save the new access token in the storage if the time was expired但是我还需要获取访问令牌过期时间以将其保存到 localStorage 并请求刷新 url,如果时间过期,则将新的访问令牌保存在存储中

I had the same problem.我有同样的问题。 One way to solve this problem is to have new serializers for access and refresh APIs, like:解决此问题的一种方法是使用新的序列化程序来访问和刷新 API,例如:

from rest_framework_simplejwt.serializers import TokenObtainPairSerializer, TokenRefreshSerializer

from rest_framework_simplejwt.tokens import RefreshToken

class TokenObtainLifetimeSerializer(TokenObtainPairSerializer):

    def validate(self, attrs):
        data = super().validate(attrs)
        refresh = self.get_token(self.user)
        data['lifetime'] = int(refresh.access_token.lifetime.total_seconds())
        return data


class TokenRefreshLifetimeSerializer(TokenRefreshSerializer):

    def validate(self, attrs):
        data = super().validate(attrs)
        refresh = RefreshToken(attrs['refresh'])
        data['lifetime'] = int(refresh.access_token.lifetime.total_seconds())
        return data

And also add new views for that as well like:并为此添加新视图,例如:

from rest_framework_simplejwt.views import TokenViewBase
from accounts.api.serializers import TokenObtainLifetimeSerializer, TokenRefreshLifetimeSerializer


class TokenObtainPairView(TokenViewBase):
    """
        Return JWT tokens (access and refresh) for specific user based on username and password.
    """
    serializer_class = TokenObtainLifetimeSerializer


class TokenRefreshView(TokenViewBase):
    """
        Renew tokens (access and refresh) with new expire time based on specific user's access token.
    """
    serializer_class = TokenRefreshLifetimeSerializer

and finally add new views to your urls like:最后向您的网址添加新视图,例如:

from django.urls import path

from accounts.api.views import TokenObtainPairView, TokenRefreshView
urlpatterns = [
    path('token/obtain/', TokenObtainPairView.as_view(), name='token-obtain'),
    path('token/refresh/', TokenRefreshView.as_view(), name='token-refresh'),
]

Now despite of those tokens of yours, you also have expire times in both of your APIs.现在,尽管您拥有这些令牌,但您的两个 API 中也都有过期时间。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM