Django RESTframework JWT验证使用

Django RESTframework JWT验证使用

我们在序列化器中验证完用户的身份后(检验用户名和密码),需要在create()方法中向用户签发JWT,在需要用到用户身份信息的时候,还需核验用户的JWT。

关于签发和核验JWT,我们可以使用Django REST framework JWT扩展来完成。

1、安装配置

安装

  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的有效期
  }

2、后端生成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

3、前端保存token

后端生成的token,前端可以保存在cookie中,也可以保存在浏览器的本地存储里。
浏览器的本地存储提供了sessionStorage 和 localStorage 两种:

  • sessionStorage 浏览器关闭即失效
  • localStorage 长期有效

使用方法

sessionStorage.变量名 = 变量值 // 保存数据
sessionStorage.变量名 // 读取数据
sessionStorage.clear() // 清除所有sessionStorage保存的数据

localStorage.变量名 = 变量值 // 保存数据
localStorage.变量名 // 读取数据
localStorage.clear() // 清除所有localStorage保存的数据

示例:
localStorage.token = response.data.token;

4、前端使用验证

当某一个功能需要对用户的身份进行验证时,需要在请求中添加token字段。
一般是在请求头里加入Authorization,并加上Bearer标注:

headers: {
	 'Authorization': 'Bearer ' + token
}

5、后端使用验证

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',
}

猜你喜欢

转载自blog.csdn.net/huazhiliandong/article/details/82876685
今日推荐