摘要:詳細介紹可以查看這篇文章理解認證及實踐特點優(yōu)點體積小,因而傳輸速度快傳輸方式多樣,可以通過參數頭部等方式傳輸嚴格的結構化。
Json web token (JWT), 根據官網的定義,是為了在網絡應用環(huán)境間傳遞聲明而執(zhí)行的一種基于JSON的開放標準((RFC 7519).該token被設計為緊湊且安全的,特別適用于分布式站點的單點登錄(SSO)場景。JWT的聲明一般被用來在身份提供者和服務提供者間傳遞被認證的用戶身份信息,以便于從資源服務器獲取資源,也可以增加一些額外的其它業(yè)務邏輯所必須的聲明信息,該token也可直接被用于認證,也可被加密。JWT 特點 優(yōu)點
詳細介紹可以查看這篇文章 理解JWT(JSON Web Token)認證及實踐
體積小,因而傳輸速度快
傳輸方式多樣,可以通過URL/POST參數/HTTP頭部等方式傳輸
嚴格的結構化。它自身(在 payload 中)就包含了所有與用戶相關的驗證消息,如用戶可訪問路由、訪問有效期等信息,服務器無需再去連接數據庫驗證信息的有效性,并且 payload 支持為你的應用而定制化。
支持跨域驗證,可以應用于單點登錄。
存在的問題JWT 自身(在 payload 中)就包含了所有與用戶相關的驗證消息,所以通常情況下不需要保存。這種設計存在幾個問題:
Token不能撤銷--客戶端重置密碼后之前的JWT依然可以使用(JWT 并沒有過期或者失效
不支持refresh token,JWT過期后需要執(zhí)行登錄授權的完整流程
無法知道用戶簽發(fā)了幾個JWT
針對第一個問題,可能的解決方法有:
保存JWT到數據庫(或Redis),這樣可以針對每個JWT多帶帶校驗
在重置密碼等需要作廢之前全部JWT時,把操作時間點記錄到數據庫(或Redis),校驗JWT時同時判斷此JWT創(chuàng)建之后有沒有過重置密碼等類似操作,如果有校驗不通過
當然,這種解決方法都會多一次數據庫請求,JWT自身可校驗的優(yōu)勢會有所減少,同時也會影響認證效率。
這篇文章主要介紹解決第二個問題(不支持refresh token)的思路。
refresh tokenrefresh token是OAuth2 認證中的一個概念,和OAuth2 的access token 一起生成,表示更新令牌,過期所需時間比access toen 要長,可以用來獲取下一次的access token。
如果JWT 需要添加 refresh token支持,refresh token需要滿足的條件有一下幾項:
和JWT一起生成返回給客戶端
有實效時間,有效時間比JWT要長
只能用來換取下一次JWT,不能用于訪問認證
不能重復使用(可選)
refresh token 獲取流程 refresh token 使用流程 代碼示例import jwt import time # 使用 sanic 作為restful api 框架 def create_token(account_id, username): payload = { "iss": "gusibi.mobi", "iat": int(time.time()), "exp": int(time.time()) + 86400 * 7, "aud": "www.gusibi.mobi", "sub": account_id, "username": username, "scopes": ["open"] } token = jwt.encode(payload, "secret", algorithm="HS256") payload["grant_type"] = "refresh" refresh_token = jwt.encode(payload, "secret", algorithm="HS256") return True, { "access_token": token, "account_id": account_id, "refresh_token": refresh_token } # 驗證refresh token 出否有效 def verify_refresh_token(token): payload = jwt.decode(token, "secret", audience="www.gusibi.com", algorithms=["HS256"]) # 校驗token 是否有效,以及是否是refresh token,驗證通過后生成新的token 以及 refresh_token if payload and payload.get("grant_type") == "refresh": # 如果需要標記此token 已經使用,需要借助redis 或者數據庫(推薦redis) return True, payload return False, None # 驗證token 是否有效 def verify_bearer_token(token): # 如果在生成token的時候使用了aud參數,那么校驗的時候也需要添加此參數 payload = jwt.decode(token, "secret", audience="www.gusibi.com", algorithms=["HS256"]) # 校驗token 是否有效,以及不能是refresh token if payload and not payload.get("grant_type") == "refresh": return True, payload return False, None參考鏈接
理解JWT(JSON Web Token)認證及實踐
理解OAuth 2.0[1]
References
[1] 理解OAuth 2.0: http://www.ruanyifeng.com/blo...
最后,感謝女朋友支持和包容,比??
也可以在公號輸入以下關鍵字獲取歷史文章:公號&小程序 | 設計模式 | 并發(fā)&協程
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規(guī)行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/43678.html
摘要:問題如何將新的發(fā)給前端比較好這個問題答案簡單,在的中設置。我這里使用解決的,將舊作為鍵,新作為值,設置一個秒過期的時間。大家可以享用這個新版,可以很好解決這個問題。 前后端分離,使用token的方式校驗用戶信息,我選擇了jwt,使用的教程在網上可以找到很多,不做介紹。 這里說明一個使用過程中,最重要的的一個環(huán)節(jié)刷新token帶來的問題。 業(yè)務要達到的目標: 用戶登錄一次之后,前端保存t...
摘要:自己在前后端分離上的實踐要想實現完整的前后端分離,安全這塊是繞不開的,這個系統(tǒng)主要功能就是動態(tài)管理,這次實踐包含兩個模塊基于搭建的權限管理系統(tǒng)后臺編寫的前端管理。 自己在前后端分離上的實踐 要想實現完整的前后端分離,安全這塊是繞不開的,這個系統(tǒng)主要功能就是動態(tài)restful api管理,這次實踐包含兩個模塊,基于springBoot + shiro搭建的權限管理系統(tǒng)后臺bootshir...
摘要:自己在前后端分離上的實踐要想實現完整的前后端分離,安全這塊是繞不開的,這個系統(tǒng)主要功能就是動態(tài)管理,這次實踐包含兩個模塊基于搭建的權限管理系統(tǒng)后臺編寫的前端管理。 自己在前后端分離上的實踐 要想實現完整的前后端分離,安全這塊是繞不開的,這個系統(tǒng)主要功能就是動態(tài)restful api管理,這次實踐包含兩個模塊,基于springBoot + shiro搭建的權限管理系統(tǒng)后臺bootshir...
閱讀 1505·2023-04-26 01:28
閱讀 3321·2021-11-22 13:53
閱讀 1432·2021-09-04 16:40
閱讀 3195·2019-08-30 15:55
閱讀 2687·2019-08-30 15:54
閱讀 2494·2019-08-30 13:47
閱讀 3374·2019-08-30 11:27
閱讀 1154·2019-08-29 13:21