JWT 與 Spring Cloud 微服務

https://keyholesoftware.com/2016/06/20/json-web-tokens-with-spring-cloud-microservices/

作者:THOMAS KENDALL

譯者:oopsguy.com

微服務安全是架構的一個重要部分。具體來說,就是認證和授權模式。

微服務認證和授權處理方式有幾種選擇,但本文只介紹 JSON Web Token 的使用。

JSON Web Token

JSON Web Token(JWT)本質上是一個獨立的身份驗證令牌,可以包含用戶標識、用戶角色和許可權等信息,以及您可以存儲任何其他信息。任何人都可以輕鬆讀取和解析,並使用密鑰來驗證真實性。有關 JSON Web Token 的簡要介紹,請查看此頁面(https://jwt.io/introduction/)。

Advertisements

微服務使用 JSON Web Token 的一個優點是,我們可以配置它以便包含用戶擁有的任何許可權。這意味著每個服務不需要與授權服務交互才能授權用戶。

JWT 的另一個優點是它們是可序列化的,足夠短的長度使得它可以放置在請求頭中。

工作原理

JWT 的工作流程相當簡單。第一次請求是一個帶有用戶名和密碼的無身份驗證端點的 POST。

認證成功后,響應將包含 JWT。之後所有的請求都附帶一個 HTTP 頭,其包含了 JWT 令牌:Authorization: xxxxx.yyyyy.zzzzz

任何服務間的請求都要通過該頭,以便其他服務可以應用授權。

開始編碼

我們需要做的第一件事是弄清楚如何生成 JWT。幸運的是,我們不是第一個踩坑的人,有幾個現成的類庫可供我們選擇。

Advertisements

我選擇了 Java JWT(https://github.com/jwtk/jjwt)。這是我的實現:

現在我們有了這個工具類,之後需要在每個微服務中配置 Spring Security。

為此,我們需要自定義一個驗證過濾器,如果存在請求頭,則讀取它。Spring 有一個認證過濾器 RequestHeaderAuthenticationFilter,我們可以繼承它。

此時,頭已經以 PreAuthenticatedAuthenticationToken 的形式轉換為 Spring Authentication 對象。

我們現在需要一個 AuthenticationProvider 用於讀取令牌,從而進行身份驗證,並將其轉換為我們自己自定義的 Authentication 對象。

有了這些組件,我們可以在 Spring Security 中使用 JWT 了。 在進行服務間通信時,我們需要傳遞 JWT。

我使用了一個 Feign 客戶端,把 JWT 作為參數。

為了傳遞 JWT,我在控制器的 Spring Security 中抓取它:

JWT 可以很好地適應分散式微服務環境,並提供了大量功能。 如果您正想為下一個微服務項目設計一個安全架構,請考慮使用 JSON Web Token。

Advertisements

你可能會喜歡