-
产生条件
HTTP是无状态的协议,这个协议是无法记录用户访问状态的,其每次请求都是独立的无关联的,而我们的网站都是设计成多个页面的,所以,我们每个页面都需要对用户的身份进行认证 -
cookie
服务器给一个用户开辟出来的一段内存空间用于保存这次会话的一些内容,如果浏览器不支持Cookie(如大部分手机中的浏览器)或者把Cookie禁用了,Cookie功能就会失效,同时不利于实现跨域访问 -
token
客户端收到 Token 以后可以把它存储起来,比如放在 Cookie 里或者 Local Storage 里,token由3部分组成,最终的格式类似于:header.payload.signature -
flask框架下token应用
pip安装Flask-JWT-Extended==3.16.0安装包
就可以使用create_access_token和create_refresh_token和get_jwt_identity这3个python自带的方法from flask_jwt_extended import create_access_token, create_refresh_token, get_jwt_identity def encode(): id = utils.uuid_generator() token = create_access_token(identity=id) # create_access_token:本质是对id,jti,expire等jwt自带的参数进行加密,其中expire可以到flask框架下app.config里读取,建议在yaml里指定,赋值给app.config # create_refresh_token:同理 from flask_jwt_extended import decode_token # 同理可以对生成的token进行解密,拿到jti,token_type,expire存入数据库 def decode(token): payload = decode_token(token)
-
创建access-token
create_access_token(identify)此参数是个uuid,推荐传递要登陆user的uuid,注意只有在用户第一次登录时才会使用access-token -
创建refresh-token
create_refresh_token(identify)此参数是个uuid,推荐传递要刷新user的uuid,因为服务端不需要刷新 Token 的过期时间,一旦 Token 过期,就反馈给前端,前端使用 Refresh Token 申请一个全新 Token 继续使用。服务端只需要在客户端请求更新 Token 的时候对 Refresh Token 的有效性进行一次检查,大大减少了更新有效期的操作,也就避免了频繁读写。当然 Refresh Token 也是有有效期的,但是这个有效期就可以长一点了,比如,以天为单位的时间 -
通过token获取信息
我们是基于payload生成的token,可以通过get_jwt_identity()方法再次拿到传递进去的payload信息,相当于加密和解密 -
校验
同理flask下同样支持check_password_hash(userobj[‘password’], password),其内部主要是根据前台传递的用户名和密码hash后与数据库里的用户名和密码进行对比对存入数据库的密码进行加密
fields = { 'password': fields.PassWordField(nullable=False) } # 这样在实例化时数据库会自动对传入的password字段进行加密,保证数据库的password字段不会暴露给开发人员
对比当前用户登录的password和数据库中保存的是否一致
from werkzeug.security import check_password_hash # 这里的两个密码分别是数据库中的密码和当前用户请求登录时的密码,因为数据库里存的密码是经过加密的,所以与当前请求对比时要对当前密码进行加密 if not check_password_hash(userobj['password'], password): Raise ValueError(_('密码错误'))
python实现token解析
最新推荐文章于 2024-08-19 10:07:46 发布