最近因為想要花些時間做完一個完整的SideProject,以前總是懂得怎麼使用,拼拼湊湊完成一個塞趴卷就交卷了,但都沒時間去真正理解這些原理的應用,而Laravel 框架本身支持的登入登出的工具,就有好多種。
例如: Breeze 、Passport 、 Socialite 、 Sanctum、Fortify、Jetstream
而之前跟著線上課程學習到都是使用 Passport 套件,跟著官方文件套用並實現會員系統,或是無腦安裝 Breeze 但仔細研究後,Passport 可用於實現 OAuth 2.0 和 JWT 身份驗證,其支持各種 OAuth 2.0 授權,並有內置的用戶身份驗證和令牌管理機制,但如果只需要一種輕量級的身份驗證機制,例如在前端和後端之間驗證用戶身份,或在不同的微服務之間進行身份驗證和授權,那其實單純選擇JWT會更方便些,下列就針對JWT學習理解作筆記。
JWT (JSON Web Token) 是一種開放標準(RFC 7519),用於在不同實體之間安全地傳遞信息的輕量級標準。它使用簽名(或加密)來確保數據的完整性和安全性。
而它的設計因為不需要使用傳統身份驗證方法(使用Cookie或Session),而是在客戶端登入後請求時,帶上資料請求伺服器驗證,驗證完成後會給予Token回傳給客戶端,而之後客戶端發出任何請求時都會帶上這段Token 給伺服器端驗證往後執行,整個流程大致如下圖(簡單用Hackmd畫一下XD)
。
JWT 由三部分組成,它們都是基於Base64編碼的字符串,並使用點(.
)來分隔:
但不應包含敏感信息
。而在 JSON Web Tokens (JWT) 中,簽名(Signature)是用於確保令牌完整性和真實性的重要部分。簽名通常使用密鑰進行生成和驗證,並且可以使用不同的加密算法。以下是一些常見的簽名加密算法:
最後組成結果就會變成下列這個合法簽發的JWT字串。
base64(Header) + base64(Payload) + base64(Signature)
而透過JWT官網:https://jwt.io/,可以用來解析JWT字串decode結果。
缺點:
總結:JWT 是實現單點登錄的有效工具,它提供了一種安全且可擴展的方式,允許用戶在多個應用程序之間無縫訪問,而不需要在每個應用程序中重新登錄,故很多跨網域的 SSO(Single Sign-On) 實作就會使用 JWT 這樣的機制,也避免了 session 所造成的問題。
下一章就要來使用 firebase/php-jwt 套件來進行實作會員登入登出功能
可以參考五倍紅寶石的JWT文章會有更詳細的說明
https://5xruby.tw/posts/what-is-jwt
文章同步發佈potato media平台
https://www.potatomedia.co/post/504ee23d-ab10-47d9-8b7d-a9dc84cc9c70