markgor
2021-09-13 20:47:02 +08:00
我自己的理解,
无状态 token 一般都是根据具体权限进行加密生成出来,接收到的时候解密验证权限,不存在加载用户信息。
比如登陆后的读写操作。
生成 token:md5 ( uid +md5 ( 1+1 ))
前端提交:token,uid (明文)
后台验证:
可读:md5(uid+md5(1)) || md5(uid+md5(2))
读写:md5(uid+md5(2))
*日志要记录就用 uid 就行了。
实际上生成规则还需要加入随机数等的,都是生成时候后端传给前端,后续前端都需要携带这些服务端才能验证,作用时防止被猜到验证规则。
然后还有一种 jwt,
这种直接把参数放入载荷里,传给前端,由于解密需要 key,所以前端是没法解密的,但是后端只需要获取到 jwt 就能解密出来。
一般情况下,你把用户 id,昵称,性别,头像,权限这些丢进去载体,
后端解密后就能直接用了,不存在查数据库。
jwt 加密方式是根据这些参数进行加密的,所以如果前端改了这些参数,加密的结果就会不一样,除非把 key 给碰撞出来了。
*很多文档都说不要把私密信息放载体,但我觉得如果对方能解密出来,那载体放什么已经不重要了。
最后,由于是无状态,那么踢出用户 或限制 不能多端登录类的无法实现,这时候可以配合 redis 做个黑名单功能,后端验证 jwt 前都查一次是否存在 redis 黑名单里,存在里面的就直接返回失败。