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保存的数据

如若有误,欢迎指出,感谢!

上一篇下一篇

猜你喜欢

热点阅读