微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决DRF的简单jwt如何从TokenObtainPairView更改响应以获取访问令牌EXPIRES时间

我在网址中写道:


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

然后,当我请求api / token /时,我得到一个只有访问和刷新令牌的json响应。
但是我还需要获取一个访问令牌过期时间,以将其保存到localStorage并请求刷新网址,如果时间已过期,则将新的访问令牌保存在存储器中

解决方法

我有同样的问题。解决此问题的一种方法是使用新的序列化程序来访问和刷新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

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

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

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

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

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。