简体中文
  • redirect uri
  • callback
  • authorization code
  • code flow
  • oidc
  • pkce

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

让我们仔细看看重定向 URI,因为它是 OIDC 认证过程中的一个关键安全组件。

Charles
Charles
Developer

什么是重定向 URI?

重定向 URI,也称为回复 URL,是 OIDC 认证过程中的关键安全组件。它指定了用户通过 OIDC 提供商成功登录后发送的 URL。更重要的是,它是应用程序接收获取令牌所需授权码的地方。

查看 Auth Wiki > 重定向 URI 以了解更多详细信息。

什么是授权码流程?

授权码流程(在 OAuth 2.0 RFC 6749, section 4.1 中定义)是 OIDC 的基本认证方法。它涉及用授权码交换访问令牌,并可选地交换刷新令牌。此流程适用于能够安全维护客户端密钥的应用程序,例如服务器端 Web 应用程序。

查看 Auth Wiki > 授权码流程 以了解更多详细信息。

重定向 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 上运行的单页面 Web 应用程序,那么通常重定向 URI 会被声明为 https://my-app.com/callback

或者如果是一个原生移动应用程序,那么重定向 URI 通常以自定义方案开头,例如 com.company://myapp/callback

其他最佳实践包括:

  • 避免使用通配符:不要在重定向 URI 中使用通配符模式。明确列出所有允许的 URI,以防止未经授权的访问。
  • 精确匹配:确保重定向 URI 与 OIDC 提供商中注册的 URI 完全匹配。即使是末尾的斜杠也可能导致不匹配。

处理登录回调

要处理返回到 redirect_uri 的授权码,请执行以下步骤:

  1. 提取授权码:从重定向 URI 的查询字符串中检索 code 参数。

  2. 用授权码交换令牌:构造到 OIDC 提供商令牌端点的 POST 请求,包括:

    • client_id:应用程序在 OIDC 提供商中的 ID
    • code:从重定向 URI 接收到的授权码
    • code_verifier:客户端生成的随机字符串
    • redirect_uri:在授权请求中使用的相同 URI
    • grant_type:授权类型,通常为 authorization_code

在 JavaScript 中的令牌交换请求示例

利用 Logto SDKs 简化代码交换过程

Logto SDKs 是按特定编程语言或框架编写的开发工具包,如 Logto React SDK、Next.js SDK 和 Swift SDK。使用 SDK 可以通过调用一两个函数大大简化流程。

这是使用 Logto 官方 React SDK 的 React "回调" 组件示例:

可以在 Logto Docs > 快速入门 中找到 SDK 集成指南。

回顾:为什么掌握 OIDC 中的重定向 URI 很重要

理解 OIDC 中授权码流程的重定向 URI 对于保障和优化你的认证过程至关重要。通过注册受信任的重定向 URI 并有效地处理登录回调,你可以确保用户获得无缝且安全的体验,并通过 Logto SDKs 简化开发工作。