我正在使用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
添加到访问令牌中。 有没有办法以这种方式添加额外的信息?
向 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",
...
}