如何在Django Rest Framework的simplejwt令牌中添加登录POST自定义claim?
实现方法
要把登录请求里的额外参数(比如project)加入access token的claims,你需要自定义TokenObtainPairSerializer,通过重写方法获取请求参数并添加到token中,具体步骤如下:
自定义序列化器
在你的Django应用中创建序列化器文件(如serializers.py),继承TokenObtainPairSerializer后重写相关方法:from rest_framework_simplejwt.serializers import TokenObtainPairSerializer class CustomTokenObtainPairSerializer(TokenObtainPairSerializer): def validate(self, attrs): # 先调用父类逻辑完成用户身份验证 data = super().validate(attrs) # 从请求体中获取传入的project参数 project = self.context['request'].data.get('project') if project: # 获取access token并添加自定义claim refresh_token = self.get_token(self.user) refresh_token.access_token['project'] = project # 更新返回的token数据 data['access'] = str(refresh_token.access_token) data['refresh'] = str(refresh_token) return data @classmethod def get_token(cls, user): token = super().get_token(user) # 这里可保留你之前已添加的其他自定义claims return token替换默认视图
在urls.py中替换默认的TokenObtainPairView,使用你自定义的序列化器:from rest_framework_simplejwt.views import TokenObtainPairView from .serializers import CustomTokenObtainPairSerializer class CustomTokenObtainPairView(TokenObtainPairView): serializer_class = CustomTokenObtainPairSerializer urlpatterns = [ # 替换原/api/token/路由 path('api/token/', CustomTokenObtainPairView.as_view(), name='token_obtain_pair'), # 其他路由配置... ]验证效果
用你提供的curl请求测试:curl -X POST -H 'Content-type: application/json' -d '{"username": "user1", "password": "supersecretpassword", "project": "project1"}' https://myurl.com/api/token/解析返回的access token,就能看到
project字段已被包含在claims中。
如果需要对project参数做合法性校验(比如检查是否与当前用户关联),可以在validate方法中添加对应的校验逻辑,避免非法参数写入token。
内容的提问来源于stack exchange,提问作者Chris Chipman
相关产品推荐
相关产品推荐

