前后端分离之JWT认证方式
原文 https://www.jianshu.com/p/180a870a308a
JWT 即 json web token
为什么会使用JWT?
1*.http协议是无状态的*
2.如果使用传统方式,将session保存到数据库中,增大了服务器数据库存储压力
3.多数据库session需要时时同步
4.大型网站是多站点,多个域名组成的,使用set cookie ,浏览器因为跨域不会设置cookie
使用对称加密 用户 id 来形成 token
第三方支付的时候,要使用非对称加密
可通过URL POST参数
或者在
HTTP header
发送
包含了用户的信息,避免了多次查询数据库(不包含敏感信息,如密码)
JWT组成
header + payload + signature
header
base64编码 header
payload
包含了用户信息 如ID
一些其他规范
iss(签发者)
exp(过期时间)
sub(面向的用户)
aud(接收方)
iat(签发时间)
Signature 签名
header_base64 + payload_base64 + 秘钥
然后使用header中的签名 HS256
pip install PyJWT
>>> import jwt
>>> encoded_jwt = jwt.encode({'some': 'payload'}, 'secret', algorithm='HS256')
>>> encoded_jwt
'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzb21lIjoicGF5bG9hZCJ9.4twFt5NiznN84AWoo1d7KO1T_yoc0Z6XOpOVswacPZg'
>>> jwt.decode(encoded_jwt, 'secret', algorithms=['HS256'])
{'some': 'payload'}
# 生成json web token
payload = {
"id":user.id,
"nick_name":user.nick_name,
"exp":datetime.utcnow()
}
token = jwt.encode(payload, self.settings["secret_key"], algorithm='HS256')
re_data["token"] = token.decode("utf8")
#web 服务返回json
#self.finsh(re_data)