【发布时间】:2020-05-24 18:12:37
【问题描述】:
【问题讨论】:
标签: django-rest-framework jwt token
【问题讨论】:
标签: django-rest-framework jwt token
你可以解析 user.tokens() 字典
user.tokens()['access']
user.tokens()['refresh]
并在响应时将它们传递给“令牌”键
【讨论】:
简单的方法
编写一个您自己的视图来扩展TokenObtainPairView 并覆盖post 方法。
# in your views.py
from rest_framework import status
from rest_framework.response import Response
from rest_framework_simplejwt.views import TokenObtainPairView
class MyTokenView(TokenObtainPairView):
def post(self, request, *args, **kwargs):
serializer = self.get_serializer(data=request.data)
try:
serializer.is_valid(raise_exception=True)
except TokenError as e:
raise InvalidToken(e.args[0])
serializer.validated_data.pop('refresh', None)
return Response(serializer.validated_data, status=status.HTTP_200_OK)
# in your urls.py
urlpatterns = [
path('api/token/', MyTokenView.as_view()),
]
复杂但更好的方法
您需要创建一个扩展TokenObtainSerializer 的序列化程序,然后如上所述定义一个自定义视图。这次把你的新序列化器作为这个视图的 serializer_class 并忘记 post 方法。
# in your serializers.py
from rest_framework_simplejwt.serializers import TokenObtainSerializer
from rest_framework_simplejwt.tokens import RefreshToken
class MyTokenObtainSerializer(TokenObtainSerializer):
@classmethod
def get_token(cls, user):
return RefreshToken.for_user(user)
def validate(self, attrs):
data = super().validate(attrs)
refresh = self.get_token(self.user)
data['access'] = str(refresh.access_token)
return data
# in your views.py
from rest_framework_simplejwt.views import TokenObtainPairView
from .serializers import MyTokenObtainSerializer
class MyTokenView(TokenObtainPairView):
serializer_class = MyTokenObtainSerializer
# in your urls.py
urlpatterns = [
path('api/token/', MyTokenView.as_view()),
]
【讨论】:
validate() 中跳过data['refresh'] 不起作用。它返回刷新和访问,即使我删除了 data['access'] = ... 。 simplejwt=4.3.0.
serializer.validated_data中的访问令牌。您可以通过在 django shell 中运行此脚本来检查它 - gist.github.com/shafi2263/6bb24d5f17acda858ecc61dcec5a6819