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

Hah*_*n't 5 django jwt django-rest-framework django-rest-framework-jwt

我在网址中写道:


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'),
    ...
]

Run Code Online (Sandbox Code Playgroud)

然后,当我请求 api/token/ 时,我得到了一个仅包含访问和刷新令牌的 json 响应。
但我还需要获取访问令牌过期时间,以便将其保存到 localStorage 并请求刷新 url,如果时间过期,则将新的访问令牌保存在存储中

Roh*_*ham 7

我有同样的问题。解决此问题的一种方法是使用新的序列化器来访问和刷新 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
Run Code Online (Sandbox Code Playgroud)

并且还为此添加新视图,例如:

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
Run Code Online (Sandbox Code Playgroud)

最后将新视图添加到您的网址,例如:

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'),
]
Run Code Online (Sandbox Code Playgroud)

现在,尽管您拥有这些令牌,但您的两个 API 中也都有过期时间。