1. 程式人生 > >python web JWT認證

python web JWT認證

前後端分離之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)