前后端分离模式
Flask Web验证方式(尝试过的):
-
cookie
cookie跨域是个比较麻烦的问题
# 在manage.py实例app后,加上钩子函数 @app.after_request def after_request(res): resp = make_response(res) res.headers['Access-Control-Allow-Origin'] = request.origin res.headers["Access-Control-Allow-Headers"] = "Content-Type" res.headers['Access-Control-Allow-Credentials'] = 'true' res.headers['Access-Control-Allow-Methods'] = "GET,POST,PUT,DELETE,OPTIONS" res.headers['Cache-Control'] = 'no-store' return resp """ 在每次请求结束,设置响应头,如果前端和后端在同一台服务器上,这样子可以解决。 如果前端的服务和后端服务不在同一台电脑,跨域问题会继续出现(没有深入) """
-
session
加密版的cookie,而且移动端支持不好,一般存放在redis中
-
token
解决跨域
设置密文,保存于服务端。请求携带
-
JWT
JSON Web Token
主要使用算法实现,不用保存在服务端,解决跨域问题,
三段字符串 格式: str1.str2.str3
生成Token
-
第一段字符串:固定格式 {“alg”:“HS256”, “typ”:“JWT”},转换为字符串,使用base64url加密
-
第二段字符串:存放数据及过期时间{data":“data”, “exp”:“过期时间”},转换为字符串,使用base64url加密
-
第三段字符串:
- 第一段和第二段拼接起来
- 然后使用HS256加密 (加盐)
- 然后再对上一步结果进行base64url加密
校验Token:
前端请求携带token,后端对token校验
- 获取Token,对Token进行切割
- 对第二段进行解密,获取data信息,校验(是否过期等)
- 将第一段和第二段进行HS256加密(加盐),判断是否和第三段相等
-
第三方库
- itsdangersous
- flask_jwt_extended
- jwt
- pyjwt
代码实现
基于itsdangersous实现
token及refresh_token
token_.py
import itsdangerous
SALT = "gogo"
SALT2 = "ogogosahfjbkbfskabk"
t = itsdangerous.TimedJSONWebSignatureSerializer(SALT, expires_in=120)
t2 = itsdangerous.TimedJSONWebSignatureSerializer(SALT2, expires_in=2592000) # 默认一个月
# 生成access_token
def gen_token_(info: dict