django-rest-framework-jwt无法获取JWT:凭证无效报错求助
解决JWT无法获取的问题:密码设置错误导致凭证不匹配
嘿,我看了你的代码,问题出在用户创建时的密码设置逻辑上,这才导致JWT接口返回"No active account found with the given credentials"。咱们一步步拆解修复:
1. 核心错误:Serializer的create方法写错了set_password参数
你的UserSerializer里这行代码完全不对:
user.set_password(self)
self是Serializer实例本身,不是密码字符串!这会把用户密码设置成一个无效的对象引用,而不是你想用的access_token。而且你创建用户时,user_data里根本没传password字段,等于用户创建后密码是空的,自然无法通过JWT的密码验证。
2. 分步骤修复
第一步:修正UserSerializer的密码设置逻辑
把create方法改成这样,确保能正确接收并设置密码:
class UserSerializer(serializers.ModelSerializer): def create(self, validated_data): # 从验证数据中取出密码(如果存在) password = validated_data.pop('password', None) # 调用父类方法创建用户 user = super().create(validated_data) # 如果有密码,就设置并保存 if password: user.set_password(password) user.save() return user class Meta: model = User fields = ('email', 'username', 'refreshToken', 'password') extra_kwargs = {'password': {'write_only': True}}
第二步:创建用户时传入access_token作为密码
在Facebook登录的视图里,创建用户的user_data要加上password字段,值就是access_token——这样JWT验证时用这个密码才能匹配:
user = User.objects.filter(email=user_email).first() # 改成first()直接拿到用户对象,更直观 if not user: user_data = { 'email': user_email, 'username': user_email, 'password': access_token # 新增这行,把access_token设为用户密码 } user_serializer = UserSerializer(data=user_data) # 这里不需要partial=True,因为我们传了所有必要字段 if user_serializer.is_valid(): user = user_serializer.save() # 保存后拿到User对象 print("saved!!!!!!!!!!!!!!!") else: print("error", user_serializer.errors)
第三步:确认JWT的验证字段配置(可选)
如果你配置JWT时是用邮箱作为验证字段,要确保settings.py里有对应的设置:
JWT_AUTH = { # 其他配置... 'JWT_USERNAME_FIELD': 'email', # 指定用邮箱作为验证字段 'JWT_PAYLOAD_GET_USERNAME_HANDLER': lambda payload: payload.get('email'), }
要是你用默认的用户名验证,那也没问题,因为你创建用户时username就是邮箱,和你传给JWT接口的email值一致。
这样修改后,再去请求JWT接口时,就能用正确的邮箱和密码(access_token)匹配到用户,成功拿到令牌啦!
内容的提问来源于stack exchange,提问作者himori123
相关产品推荐
相关产品推荐

