python web JWT認證
阿新 • • 發佈:2018-12-12
前後端分離之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)