我们在序列化器中验证完用户的身份后(检验用户名和密码),需要在create()方法中向用户签发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), # 指明token的有效期
}
在注册成功后,连同返回token,修改序列化器,在create方法中增加手动创建token的方法。 一定要在用户创建完成,并且保存之后再创建token,否则jwt_payload_handler(user)方法会出现异常。
# 补充生成记录登录状态的token
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)
user.token = token
后端生成的token,前端可以保存在cookie中,也可以保存在浏览器的本地存储里。
浏览器的本地存储提供了sessionStorage 和 localStorage 两种:
使用方法
sessionStorage.变量名 = 变量值 // 保存数据
sessionStorage.变量名 // 读取数据
sessionStorage.clear() // 清除所有sessionStorage保存的数据
localStorage.变量名 = 变量值 // 保存数据
localStorage.变量名 // 读取数据
localStorage.clear() // 清除所有localStorage保存的数据
示例:
localStorage.token = response.data.token;
当某一个功能需要对用户的身份进行验证时,需要在请求中添加token字段。
一般是在请求头里加入Authorization,并加上Bearer标注:
headers: {
'Authorization': 'Bearer ' + token
}
Django REST framework JWT提供了登录签发JWT的视图,可以直接使用
from rest_framework_jwt.views import obtain_jwt_token
urlpatterns = [
url(r'^“此处为访问路由”/$', obtain_jwt_token),
]
默认的返回值仅有token,如果返回值中还需要有其他字段,通过修改该视图的返回值可以完成对应的需求
def jwt_response_payload_handler(token, user=None, request=None):
"""
自定义jwt认证成功返回数据
"""
return {
'token': token,
'user_id': user.id, # 自定义字段1
'username': user.username # 自定义字段2
}
# JWT
修改配置文件
JWT_AUTH = {
'JWT_EXPIRATION_DELTA': datetime.timedelta(days=1),
'JWT_RESPONSE_PAYLOAD_HANDLER': 'users.utils.jwt_response_payload_handler',
}