Django REST framework JWT
2018-07-12 本文已影响0人
NameJaho
前言:在Django项目中,在JWT介绍的文章中说到,要保存用户的登陆状态时,我们需要用到Session或者JWT机制来实现,本文中我们是基于 Json Web Token 机制来实现这一功能的。
在用户注册模块中,对用户的用户名和密码的检验之后,我们需要对用户签发JWT,在需要用到用户身份信息的时候,还需核验用户的JWT。
关于签发和核验JWT,我们可以使用Django REST framework JWT扩展来完成。
1. 安装
pip install djangorestframework-jwt
2. 配置
REST_FRAMEWORK = {
'DEFAULT_AUTHENTICATION_CLASSES': (
'rest_framework_jwt.authentication.JSONWebTokenAuthentication',
'rest_framework.authentication.SessionAuthentication',
'rest_framework.authentication.BasicAuthentication',
),
}
JWT_AUTH = {
# 指明token的有效期
'JWT_EXPIRATION_DELTA': datetime.timedelta(days=1),
}
3. 后端使用(手动签发)
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赋予user
user.token = token
# 关键源码
def jwt_payload_handler(user):
...
payload = {
'user_id': user.pk,
'username': username,
'exp': datetime.utcnow() + api_settings.JWT_EXPIRATION_DELTA
}
if hasattr(user, 'email'):
payload['email'] = user.email
if isinstance(user.pk, uuid.UUID):
payload['user_id'] = str(user.pk)
...
4. 登录签发视图
Django REST framework JWT提供了登录签发JWT的视图,在验证用户名密码时调用了Django中的authenticate方法校验用户名密码的,如需自定义认证 可以重写authenticate方法 需继承
django.contrib.auth.backends.ModelBackend
默认返回token,可自定义返回
urls.py
from rest_framework_jwt.views import obtain_jwt_token
urlpatterns = [
url(r'^authorizations/>, obtain_jwt_token),
]
utils.py
def jwt_response_payload_handler(token, user=None, request=None):
"""
自定义jwt认证成功返回数据
"""
return {
'token': token,
'user_id': user.id,
'username': user.username
}
# 修改配置
# JWT
JWT_AUTH = {
'JWT_EXPIRATION_DELTA': datetime.timedelta(days=1),
'JWT_RESPONSE_PAYLOAD_HANDLER':'users.utils.jwt_response_payload_handler',
}
5. 前端保存token
我们可以将JWT保存在cookie中,也可以保存在浏览器的本地存储里,我们保存在浏览器本地存储中,浏览器的本地存储提供了sessionStorage 和 localStorage 两种:
--> sessionStorage 浏览器关闭即失效
--> localStorage 长期有效
// 记住用户状态
sessionStorage.变量名 = 变量值 // 保存数据
sessionStorage.变量名 // 读取数据
sessionStorage.clear() // 清除所有sessionStorage保存的数据
localStorage.变量名 = 变量值 // 保存数据
localStorage.变量名 // 读取数据
localStorage.clear() // 清除所有localStorage保存的数据
如若有误,欢迎指出,感谢!