django项目中使用JWT(djangorestframework-jwt)

我们在验证完⽤户的身份后(检验⽤户名和密码),需要向⽤户签发JWT,在需要⽤到⽤户身份信息的时候,还需核验⽤户的JWT。关于签发和核验JWT,我们可以使⽤Django REST framework JWT扩展来完成。

1.安装

pip install djangorestframework-jwt

2.配置

REST_FRAMEWORK = {
    'DEFAULT_AUTHENTICATION_CLASSES': (
        'rest_framework_jwt.authentication.JSONWebTokenAuthentication', # 先进行token认证
        'rest_framework.authentication.SessionAuthentication', # 次要进行session认证
        'rest_framework.authentication.BasicAuthentication', # 最后进行基本认证
    ),
}
import datetime
JWT_AUTH = {
  # JWT_EXPIRATION_DELTA 指明token的有效期
    'JWT_EXPIRATION_DELTA': datetime.timedelta(days=1),
}

3.后端实现


Django REST framework JWT提供了登录签发JWT的视图,可以直接使用,但是默认的返回值仅有token。

from django.conf.urls import re_path
from rest_framework_jwt.views import obtain_jwt_token

urlpatterns = [
    re_path(r'^authorizations/$', obtain_jwt_token),  # 登录并且由JWT签发token
]

4.自定义返回token值

如果我们还需在返回值中增加username和user_id。通过重写视图的返回值可以完成我们的需求。

def jwt_response_payload_handler(token, user=None, request=None):
    """
    自定义jwt认证成功返回数据
    """
    return {
        'token': token,  # 返回jwt签发的token
        'id': user.id, # 返回用户ID
        'username': user.username  # 返回用户的用户名
    }

注意需要修改配置文件

# JWT配置
JWT_AUTH = {
# token有效期
    'JWT_EXPIRATION_DELTA': datetime.timedelta(days=1),
    # 指明自定义返回数据在哪个函数中
    'JWT_RESPONSE_PAYLOAD_HANDLER': 'xxx.utils.jwt_response_payload_handler',
}
JWT的构成

在用户注册或登录之后,我们想要记录用户的登录状态,或者为用户创建身份认证的凭证,我们不在使用 Session认证机制,而是使用 Json Web Token(本质就是token)认证机制。

JWT(Json Web Token)就是一段字符串,由三段信息构成的,将这三段信息文本用 .连接在一起就构成了JWT字符串。类似于如下。

django项目中使用JWT(djangorestframework-jwt)_第1张图片

JWT工作原理
  1. jwt分三段式:头.体.签名 (header.payload.signature)。
  2. 头和体使用base64进行可逆转码(不是加密,以为可以反解),让服务器可以反解出user对象,而签名是不可逆加密,从而保证整个token的安全性。
  3. 头体签名三部分,都是采用json格式的字符串,进行加密,可逆转码使用base64算法,不可逆加密使用md5算法。
    总结
- 用户登录成功之后,会给前端返回一段token。
      - token是由.分割的三段组成。
          - 第一段:类型和算法信心
          - 第二段:用户信息+超时时间
          - 第三段:hs256(前两段拼接)加密 + base64url
      - 以后前端再次发来信息时
          - 超时验证
          - token合法性校验
  优势:
      - token只在前端保存,后端只负责校验。
      - 内部集成了超时时间,后端可以根据时间进行校验是否超时。
      - 由于内部存在hash256加密,所以用户不可以修改token,只要一修改就认证失败。

你可能感兴趣的:(django,python)