JWT(Json Web Token)实现状态保持

JWT简介

Json web token (JWT), 是为了在网络应用间传递声明的基于JSON的开放标准,该token被设计为紧凑且安全的,特别适用于分布式站点的单点登录(SSO)场景。其中的分布式站点的单点登陆的状态保持,在这里简单介绍下:举京东的例子,主页www.jd.com作为一个站点部署在单独的服务器上,其购物车www.car.jd.com作为单独的一个站点部署在单独的服务器上。那么单点登陆,意思就是在这两个站点中的任意一个完成登陆之后,在另外的一个站点也会完成状态保持,就是单点登陆。好了言归正传介绍JWT。
JWT在实现状态保持上有着得天的优势:1>json的通用性,所以JWT是可以进行跨语言支持的 2>jwt的构成非常简单,字节占用很小,便于传输 3>扩展性好不需要在服务端保存会话信息

传统的状态保持实现方法

session

http协议本身是一种无状态的协议,如果需要实现用户状态保持,我们通常使用session,将用户信息存储在服务端,并把session的key响应给浏览器的cookie中,用户下一次再来访问我们的时候带上cookie我们就可以对其实现状态保持。这样做的缺点很多:1>当用户量很大的时候我们需要在服务端缓存大量的session信息,如果缓存在服务器的内存中,服务端开销会变大,甚至会出现严重的后果2>cookie在浏览器中用户可以选择禁用的,我们就无法实现状态保持3>扩展性不好,session是保存在服务器的内存中的,当有多个站点的时候就无法实现多站点的任意单点状态保持。
jwt

DRF中实现JWT

安装和配置

# 安装相应的模块
pip install djangorestframework-jwt

# 配置settings文件
REST_FRAMEWORK = {
    'DEFAULT_AUTHENTICATION_CLASSES':(  
        'rest_framework_jwt.authentication.JSONWebTokenAuthentication',
    ),
}

JWT_AUTH = {
	# 配置jwt签发有效期
    'JWT_EXPIRATION_DELTA': datetime.timedelta(days=1),
}

封装使用

# 将方法封装到项目的utils中,创建jwt_token.py
from rest_framework_jwt.settings import api_settings


def get_jwt_token(user):
    # JWT做状态保持的时机是:用户注册成功之后,返回结果之前
    jwt_payload_handler = api_settings.JWT_PAYLOAD_HANDLER
    jwt_encode_handler = api_settings.JWT_ENCODE_HANDLER

    # 当前的注册用户对象
    payload = jwt_payload_handler(user)
    # JWT token
    token = jwt_encode_handler(payload)
    return token

调用

在需要使用的位置直接调用utils中的get_jwt_token(user)方法,需要将user对象传入到方法中,得到的返回值就是token,可以直接放在Response中直接签发。

# 例1
# 用户注册成功之后,创建新用户返回响应之前,做状态保持
from ..utils.jwt_token import get_jwt_token


def create(self, validated_data):
	user = super().create(validated_data)
	user.set_password(password)
	user.save()
	# 调用get_jwt_token方法
	token = get_jwt_token(user)
	# 将token字段添加到user对象中,做响应
	user.token = token
	return user
	

服务端开启jwt验证

使用的就是settings文件中配置的自定义的用户认证。
前端需要在每次请求的时候将token放在headers中携带上。

猜你喜欢

转载自blog.csdn.net/MrNoboday/article/details/81154663