OAuth2 JWT 認證

介紹

OAuth2 JWT 認證是 OAuth 2.0 身份認證方案中的一種高效實現,它允許客戶端透過 JSON Web Token(JWT)進行安全可靠的身份驗證。這種方法既保證了安全性,又提高了系統的效能和可擴充套件性。

OpenResty Edge 為開發者提供了便捷的頁面規則動作,使得 OAuth2 JWT 認證的實現變得簡單直觀。

OAuth2 JWT 認證設定介面

配置引數

該動作包含以下關鍵引數:

  1. Key(關鍵字)

  2. 接受不支援的演算法: 預設情況下應保持關閉狀態,以拒絕使用不支援演算法簽名的令牌。開啟此選項將導致無法驗證令牌簽名,存在安全風險。

  3. 令牌簽名演算法: 支援多種演算法,包括 HS256、HS512、RS256、RS512、ES256、ES512 和 none。請根據安全需求選擇適當的演算法。

探測 URL 規範

當選擇"探測"作為 Key 型別時,探測 URL 的內容應遵循 OpenID Connect Discovery 1.0 規範:

  1. 必須使用 HTTPS 協議。
  2. 標準路徑通常為 /.well-known/openid-configuration
  3. 返回的 JSON 文件應包含完整的 OAuth2 和 OpenID Connect 配置資訊。
  4. 關鍵欄位包括 issuerauthorization_endpointtoken_endpointjwks_uri 等。

實際應用示例

以下示例展示瞭如何配置和測試 OAuth2 JWT 認證:

OAuth2 JWT 認證配置示例

在本例中,我們選擇:

  • Key 型別:對稱秘鑰,取值為 openresty
  • 簽名演算法:HS256(HMAC with SHA-256)

測試場景

  1. 無認證資訊請求

    $ curl http://test.com/anything -v
    ...
    < HTTP/1.1 403 Forbidden
    ...
    

    結果:403 狀態碼,表示訪問被禁止。

  2. 錯誤認證資訊請求

    $ curl http://test.com/anything -H 'Authorization: Bearer invalid-token' -v
    ...
    < HTTP/1.1 403 Forbidden
    ...
    

    結果:同樣返回 403 狀態碼。

  3. 正確認證資訊請求

    $ 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 應用中身份驗證的優秀選擇。