JWT认证不通过
Serializer
class MyTokenObtainPairSerializer(TokenObtainPairSerializer):
@classmethod
def get_token(cls, user):
token = super().get_token(user)
token['name'] = user.username
return token
View
class Login(TokenObtainPairView):
serializer_class = MyTokenObtainPairSerializer
def post(self, request, *args, **kwargs):
serializer = self.get_serializer(data=request.data)
try:
serializer.is_valid(raise_exception=True)
serializer.validated_data['code'] = status.HTTP_200_OK
user = User.objects.filter(username=request.data['username']).first()
data = {
'token': serializer.validated_data['access'],
'user_name': user.username,
'user': user.id,
'is_superuser': user.is_superuser,
'email': user.email,
'perms': user.get_all_permissions(),
}
return restful.success('登录成功!', data)
except:
return restful.unauthorized('账号或密码错误!')
异常描述
-
环境
Ubuntu Server 18.04.1 LTS 64bit
Python3.6.9
Django3.0
-
异常情况
admin后台登录正常,DRF+JWT登录异常 -
Debug报错信息
AttributeError: 'str' object has no attribute 'decode'
-
报错位置
/root/.virtualenvs/djangohelper/lib/python3.6/site-packages/rest_framework_simplejwt/tokens.py
原因分析
因为版本问题,rest_framework_simplejwt
库的tokens.py
文件第41行使用return token.decode('utf-8')
时会报AttributeError: 'str' object has no attribute 'decode'
错误,导致DRF+JWT登录过程中serializer.is_valid(raise_exception=True)
不通过。