OAuth2 JWT 認證
介紹
OAuth2 JWT 認證是 OAuth 2.0 身份認證方案中的一種高效實現,它允許客戶端透過 JSON Web Token(JWT)進行安全可靠的身份驗證。這種方法既保證了安全性,又提高了系統的效能和可擴充套件性。
OpenResty Edge 為開發者提供了便捷的頁面規則動作,使得 OAuth2 JWT 認證的實現變得簡單直觀。
配置引數
該動作包含以下關鍵引數:
Key(關鍵字):
- 探測:輸入探測 URL,如
https://accounts.google.com/.well-known/openid-configuration
。這種方式能自動獲取 OAuth2 所需的配置資訊,包括授權伺服器地址、令牌端點和簽名公鑰等。如您需要生成發現 URL 的內容,可以參考 Google OAuth 2.0 服務的發現 URL中的內容以及檢視規範 OpenID Connect Discovery 1.0 incorporating errata set 2 和 OAuth 2.0 Authorization Server Metadata。 - 對稱秘鑰:輸入用於加密和驗證 JWT 簽名的秘鑰。
- 公鑰:輸入用於驗證 JWT 簽名的公鑰(私鑰用於生成簽名)。
- 探測:輸入探測 URL,如
接受不支援的演算法: 預設情況下應保持關閉狀態,以拒絕使用不支援演算法簽名的令牌。開啟此選項將導致無法驗證令牌簽名,存在安全風險。
令牌簽名演算法: 支援多種演算法,包括 HS256、HS512、RS256、RS512、ES256、ES512 和 none。請根據安全需求選擇適當的演算法。
探測 URL 規範
當選擇"探測"作為 Key 型別時,探測 URL 的內容應遵循 OpenID Connect Discovery 1.0 規範:
- 必須使用 HTTPS 協議。
- 標準路徑通常為
/.well-known/openid-configuration
。 - 返回的 JSON 文件應包含完整的 OAuth2 和 OpenID Connect 配置資訊。
- 關鍵欄位包括
issuer
、authorization_endpoint
、token_endpoint
、jwks_uri
等。
實際應用示例
以下示例展示瞭如何配置和測試 OAuth2 JWT 認證:
在本例中,我們選擇:
- Key 型別:對稱秘鑰,取值為
openresty
。 - 簽名演算法:HS256(HMAC with SHA-256)
測試場景
無認證資訊請求:
$ curl http://test.com/anything -v ... < HTTP/1.1 403 Forbidden ...
結果:403 狀態碼,表示訪問被禁止。
錯誤認證資訊請求:
$ curl http://test.com/anything -H 'Authorization: Bearer invalid-token' -v ... < HTTP/1.1 403 Forbidden ...
結果:同樣返回 403 狀態碼。
正確認證資訊請求:
$ curl http://test.com/anything -H 'Authorization: Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJmb28iOiJiYXIifQ._FOTfoCTzKHWcBDYf1rfRkg-g6D_Mg8dnccLR_geCH0' -v ... < HTTP/1.1 404 Not Found ...
結果:返回 404,表明認證成功,但請求的資源不存在。
JWT Token 生成示例
以下是一個使用 Lua 生成 JWT token 的示例程式碼:
檔名:jwt-example.lua
local jwt = require "resty.jwt"
-- set up the payload
local payload = {
iss = "your_issuer",
sub = "user_id",
exp = ngx.time() + 3600, -- expires in 1 hour
iat = ngx.time(),
-- other custom fields
}
-- sign with a symmetric key
local jwt_token = jwt:sign(
"openresty", -- Your secret key
{
header = {typ = "JWT", alg = "HS256"},
payload = payload
}
)
ngx.say(jwt_token)
執行命令:
/usr/local/openresty-utils/bin/resty2 jwt-example.lua
這個示例使用 resty.jwt
庫生成 JWT token,設定了常見的 claims 如 iss
(發行者)、sub
(主題)、exp
(過期時間)和 iat
(簽發時間)。你可以根據具體需求新增其他自定義欄位。
注意:示例中使用了 HS256 演算法和對稱金鑰。在生產環境中,請確保使用足夠複雜的金鑰,並採取適當的措施保護金鑰安全。
透過這種方式實現的 OAuth2 JWT 認證,既保證了安全性,又提高了系統效率,是現代 Web 應用中身份驗證的優秀選擇。