繁體中文(台灣)
  • redirect uri
  • callback
  • authorization code
  • code flow
  • oidc
  • pkce

理解 OpenID Connect (OIDC) 中的重定向 URI 和授權碼流程

讓我們更深入地了解重定向 URI,因為它是 OIDC 驗證過程中的一個關鍵安全組件。

Charles
Charles
Developer

什麼是重定向 URI?

重定向 URI,也稱為回覆 URL,是 OIDC 驗證過程中的一個關鍵安全組件。它指定了用戶通過 OIDC 提供者成功登入後被發送到的網址。更重要的是,應用程序從這裡接收獲取令牌所需的授權碼。

查看 Auth Wiki > Redirect URI 以獲取更多詳細信息。

什麼是授權碼流程?

授權碼流程(在 OAuth 2.0 RFC 6749,第 4.1 節 中定義)是 OIDC 中的一種基本驗證方法。它涉及用授權碼交換訪問令牌,且可選擇性地交換刷新令牌。此流程適合可安全維護客戶端密鑰的應用程序,例如伺服器端網頁應用程序。

查看 Auth Wiki > Authorization Code Flow 以獲取更多詳細信息。

在授權碼流程中重定向 URI 如何運作?

在授權碼流程中,重定向 URI 是用戶成功驗證後,OIDC 提供者傳送授權碼的目的地。它必須預先註冊於 OIDC 提供者以確保安全性並防止未授權的重定向。

以下是如何在 Logto Console 中註冊重定向 URI: redirect-uri

當啟動登入時:

  1. 授權請求:你的應用程序將用戶引導到 OIDC 提供者的授權端點,包括像 client_idresponse_typescoperedirect_uri 等參數。
  2. 用戶驗證:用戶在 OIDC 提供者處驗證。
  3. 授權碼傳遞:驗證成功後,OIDC 提供者將用戶重定向到指定的 redirect_uri,並在查詢參數中包含授權碼。

OIDC 提供者會對 redirect_uri 進行驗證,與預註冊的 URI 列表進行匹配。如果有不匹配,將返回 invalid_redirect_uri 錯誤,通過防止未授權的端點接收令牌來增強安全性。

重定向 URI 的最佳實踐

在現實生活的使用案例中,一個常見的最佳實踐是聲明一個專用的“回調”頁面並關聯一個路由 / 深度鏈接,允許從外部直接訪問。此鏈接應用作為重定向 URI。

假設你有一個單頁網頁應用程序在 https://my-app.com 上運行,那麼通常重定向 URI 會被聲明為 https://my-app.com/callback

或者,如果它是本地移動應用程序,那麼重定向 URI 通常以自定義方案開始,例如 com.company://myapp/callback

其他最佳實踐包括:

  • 避免使用萬用字元:不要在重定向 URI 中使用萬用字元模式。明確列出所有允許的 URI 以防止未授權的訪問。
  • 完全匹配:確保重定向 URI 與 OIDC 提供者中註冊的 URI 完全匹配。即使是一個尾隨的斜杠也可能導致不匹配。

處理登入回調

要處理返回到你的 redirect_uri 的授權碼,請按照以下步驟操作:

  1. 提取授權碼:從重定向 URI 的查詢字符串中檢索代碼參數。

  2. 用授權碼交換令牌:組合一個 POST 請求到 OIDC 提供者的令牌端點,包括:

    • client_id: 你的應用程序在 OIDC 提供者中的 ID
    • code: 從重定向 URI 獲得的授權碼
    • code_verifier: 在客戶端生成的一個隨機字符串
    • redirect_uri: 在授權請求中使用的相同 URI
    • grant_type: 授權類型,通常是 authorization_code

使用 JavaScript 的令牌交換請求示例

通過利用 Logto SDK 簡化代碼交換過程

Logto SDK 是用特定編程語言或框架編寫的開發工具包,例如 Logto React SDK、Next.js SDK 和 Swift SDK。使用 SDK 可以通過只調用一兩個函數來大大簡化操作。

以下是使用 Logto 官方 React SDK 的 React "回調" 元件範例:

SDK 集成指南可以在 Logto Docs > Quick-starts 中找到。

總結:為什麼掌握 OIDC 中的重定向 URI 很重要

理解 OIDC 中授權碼流程的重定向 URI 對於保障和優化你的驗證流程至關重要。通過註冊受信任的重定向 URI 和高效處理登入回調,你可以確保用戶獲得順暢且安全的體驗,同時通過 Logto SDK 簡化你的開發工作。