14 2 基於令牌的認證

2021-08-20 13:22:19 字數 2444 閱讀 1332

上節我們介紹了基於http的認證, 由於客戶端每次發出請求時都要傳送密令, 為了避免老是傳送敏感資訊, 我們可以提供一種基於令牌的認證方案。

class user(db.model):

#生成認證令牌

def generate_auth_token(self, expiration):

return s.dumps()

#驗證認證令牌, 如果令牌可用就返回對應的使用者

@staticmethod

def verify_auth_token(self, token):

try:

data = s.loads()

except:

return none

return user.query.get(data['id'])

@auth.verify_password

def verify_password(email_or_token, password):

#如果填的是token字串

if password = '':

g.current_user = user.verify_auth_token(email_or_token)

g.token_userd = true

return g.current_user is not none

#如果填的是email和密碼

user = user.query.filter_by(email=email_or_token).first()

if not user:

return false

g.current_user = user

g.token_used = false

return user.verify_password(password)

**分析:

使用者訪問api藍本註冊的路由時, 首先會訪問@api.before_request修飾器修飾的before_request函式, 而before_request函式被修飾器@auth.login_required修飾, 所以會觸發auth.verify_password認證,就會彈出類似下面的對話方塊要求使用者填寫認證資訊

如果我們填寫的是token字串, 那麼密碼欄為空, verify_password函式驗證token, 並返回結果;

如果我們填寫的是email和password, 那麼verify_password函式驗證email和密碼, 並返回結果;

這裡我們用g.token_used變數來讓檢視函式區分這兩種認證方法。

因此認證函式的作用就是, 認證所有訪問 api藍本註冊的路由 的使用者, 如果認證通過g.current_user儲存認證通過的使用者, 並訪問路由, 認證失敗則無法訪問路由。

@api.route('/token')

def get_token():

if g.token_used:

return unauthorized('invalid credentials')

return jsonify(

**分析:

如果使用者訪問該路由獲取token, 認證通過時, g.current_user會儲存認證通過的使用者, 然後訪問該路由, 返回由該使用者id生成的token字串, g.token_used的if判斷是為了防止使用舊token生成新token。

1)訪問生成token的路由

2)填寫使用者名稱密碼進行認證

3)認證成功,檢視函式返回生成的token字串

4)下次訪問api註冊的路由時就可以填寫token字串

5)如果我們試圖用舊token生成新token

6)返回錯誤

JWT認證方案與禁用令牌策略

1.1 jwt 不可逆加密 訊息摘要 md 訊息認證 ma缺點 數字簽名 傳送者使用私鑰對資料摘要加密 簽名 接收者使用對應的公鑰解密,然後對資料進行雜湊處理,比對摘要資訊是否一致 代表演算法 rsa 使用場景 優點 缺點 1.2 pyjwt 1.3 jwe 非對稱加密 生成方式 openssl 主...

Go 基於令牌桶的限流器實現

目錄 如果一般流量過大,下游系統反應不過來,這個時候就需要限流了,其實和上地鐵是一樣的,就是減慢上游訪問下游的速度。限制訪問服務的頻次或者頻率,防止服務過載,被刷爆等。golang 官方擴充套件包 time golang.org x time rate 中,提供了乙個基於令牌桶等限流器實現。具體使用...

基於挑戰 應答的認證

基於挑戰 應答屬於密碼鑑別的一種。特定是密碼不在網路上傳輸。該認證機制中認證者 伺服器 每次向被認證者 客戶端 傳送乙個不同的 挑戰 字串,客戶端收到這個 挑戰 字串後,按照雙方事先協商好的方法應答。挑戰相當於諮詢,應答相當於回答。1 客戶端向伺服器端發錯請求,要求進行身份驗證。2 伺服器從資料庫中...