Django Rest Framework 中的 JWT 令牌声明

问题描述 投票:0回答:1

我正在使用rest_framework_simplejwt,并且想向出于授权目的而返回的访问令牌添加额外的信息。 按照https://django-rest-framework-simplejwt.readthedocs.io/en/latest/customizing_token_claims.html我可以修改访问令牌。 不过,我希望能够根据初始发布的登录添加声明。 例如:

curl -X POST -H 'Content-type: application/json' -d '{"username": "user1", "password": "supersecretpassword", "project": "project1"}' https://myurl.com/api/token/

我希望能够将

project1
添加到访问令牌中。 有没有办法以这种方式添加额外的信息?

django django-rest-framework jwt
1个回答
0
投票

向 TokenObtainSerializer 添加了项目字段。

CustomTokenObtainPairSerializer 在 TokenObtainPairSerializer 中添加了将项目值添加到令牌有效负载的过程。

序列化器.py

from django.contrib.auth.models import update_last_login
from rest_framework_simplejwt.tokens import RefreshToken
from rest_framework_simplejwt.settings import api_settings
from rest_framework_simplejwt.serializers import TokenObtainSerializer
from rest_framework import serializers


class CustomTokenObtainSerializer(TokenObtainSerializer):
  
  def __init__(self, *args, **kwargs) -> None:
    super().__init__(*args, **kwargs)
    self.fields["project"] = serializers.CharField()
    
class CustomTokenObtainPairSerializer(CustomTokenObtainSerializer):
  token_class = RefreshToken

  def validate(self, attrs):
      data = super().validate(attrs)
      refresh = self.get_token(self.user)
      refresh["project"] = attrs["project"]

      data["refresh"] = str(refresh)
      data["access"] = str(refresh.access_token)

      if api_settings.UPDATE_LAST_LOGIN:
          update_last_login(None, self.user)
      return data

为了使上述Serializer类在TokenOptainPairView中可用,我修改了settings.py SIMPLE_JWT相关的设置值。

设置.py

SIMPLE_JWT = {
  ...
  "TOKEN_OBTAIN_SERIALIZER": "yourapp.serializers.CustomTokenObtainPairSerializer",
  ...
}

enter image description here

enter image description here

© www.soinside.com 2019 - 2024. All rights reserved.