简体中文
  • 重定向 uri
  • 回调
  • 授权码
  • 代码流
  • oidc
  • pkce

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

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

Charles
Charles
Developer

什么是重定向 URI?

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

查看 重定向 URI 维基 以获取更多详细信息。

什么是授权码流程?

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

查看 授权码流程维基 以获取更多详细信息。

重定向 URI 在授权码流程中的工作机制是什么?

在授权码流程中,重定向 URI 是 OIDC 提供商在用户成功认证后发送授权码的目的地。它必须在 OIDC 提供商处预注册,以确保安全并防止未经授权的重定向。

这是你如何在 Logto 控制台 中注册一个重定向 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 提供商中注册的完全匹配。即使是尾部斜杠也可能导致不匹配。

处理登录回调

若要处理返回到 redirect_uri 的授权码,请按照以下步骤操作:

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

  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 "Callback" 组件示例:

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

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

了解 OIDC 中授权码流程中的重定向 URI 对于保护和优化你的认证过程至关重要。通过注册可信的重定向 URI 并有效处理登录回调,你可以确保为用户提供无缝且安全的体验,同时通过 Logto SDK 简化开发工作。