Django商城项目笔记No.9用户部分-注册接口签发JWTtoken
我们在验证完用户的身份后(检验用户名和密码),需要向用户签发JWT,在需要用到用户身份信息的时候,还需核验用户的JWT。
关于签发和核验JWT,我们可以使用Django REST framework JWT扩展来完成。
安装配置
# 安装 pip install djangorestframework-jwt
# 配置 REST_FRAMEWORK = { 'DEFAULT_AUTHENTICATION_CLASSES': ( 'rest_framework_jwt.authentication.JSONWebTokenAuthentication', 'rest_framework.authentication.SessionAuthentication', 'rest_framework.authentication.BasicAuthentication', ), } JWT_AUTH = { 'JWT_EXPIRATION_DELTA': datetime.timedelta(days=1), }
- JWT_EXPIRATION_DELTA 指明token的有效期
手动签发JWT的方法
from rest_framework_jwt.settings import api_settings jwt_payload_handler = api_settings.JWT_PAYLOAD_HANDLER jwt_encode_handler = api_settings.JWT_ENCODE_HANDLER payload = jwt_payload_handler(user) token = jwt_encode_handler(payload)
在注册成功后,连同返回token,需要在注册视图中创建token。
修改CreateUserSerializer序列化器,在create方法中增加手动创建token的方法
注意导包
oken有了,我们需要将token返回给前端,怎么反呢?
我们返回的是user模型类转换后的json数据,那么就将token增加到user模型类中即可:
因为token字段只需要返回给前端,所以是read_only,只需要序列化。
返回user前,给user模型类增加token属性:
问题:
为啥还要添加user.token=token。给user增加token属性呢?
上边的序列号器不是增加过token了?注意序列化器是序列化器,模型类是模型类。
序列化器中有token字段,只会在序列化的时候,帮助你序列化token字段而已,但是你的模型类中没有token字段,序列化器怎么帮你做序列化操作呢?(序列化是将模型类转换为字典,转换为json)
测试