712 字
4 分钟
登录鉴权
浏览器存储
cookie
如果cookie有值,浏览器会自动的在请求之前把cookie添加进去。
local storage
前端把字段存储到对应域名专属的存储空间,请求的时候手动带上这个字段。
session
传统的登录鉴权方法,登录验证成功后后端返回一个随机的token,并维护着一个用户和token对应的表,token返回到前端,可以把他存到随便一个浏览器存储里,只要下次请求带着这个token返回到后端就行了。后端查表验证这个人是谁。 查到有记录,那么就成功鉴权了。如果想要让对应的session失效,就直接在数据库里删除了对应的记录就行了。
JWT
和上面一样,登陆验证成功之后,后端返回一个token,但这个token不是随机值,他就是一个编码过的对象。总共有3段,用.分隔。
- 第一段Header头部,带着加密算法,告诉后端该用什么算法验证签名
- 第二段Payload负载,想带什么就带什么,一般是用户的uid、用户名、token过期时间。
- 第三段Signature签名,负载和secret一起生成的一个东西,能够用来验证第二段payload有没有被篡改。 这三段被base64编码之后分段被放在token里,下面是个典型的token
In [1]: import jwtIn [2]: encoded_jwt = jwt.encode({"some": "payload"}, "secret", algorithm="HS256")In [3]: encoded_jwtOut[3]: 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzb21lIjoicGF5bG9hZCJ9.4twFt5NiznN84AWoo1d7KO1T_yoc0Z6XOpOVswacPZg'#头部:HS256.负载:{"some": "payload"}.签名:<用payload和secret一起生成的>token被用户从前端重新发送回来之后,进行验证用负载和secret重新算一遍比较一下签名是否一致,一致则认为payload里的内容可以信任,就认证了用户的身份。 这个token谁也能用base64编码的方式解码出来里面的内容,但是就算能修改里面的payload字段重新编码,最后到后端还是不行,因为payload和签名对应不上了。 jwt的方式,除非后端把secret或者编码方式变了,不然是不可能让token手动失效的。
flask session
很方便的flask自带的库,其实和jwt原理一样只不过是存在了cookie里,而大部分别的都是存在local storage里的。
pyjwt
这个库是实现jwt最常用的库,其实也很简单,其实就俩函数,一个生成jwt,一个验证jwt,你看他文档,非常之简单一看就会用了。
其他
建议后端统一写装饰器,装饰所有需要被验证身份的api,或者是别的需求比如判断请求的ip啥的,要啥有啥。前端在api的实现的那里统一写拦截器在请求头上添加jwt