理解 OpenID Connect (OIDC) 中的重定向 URI 和授权码流程
让我们仔细看看重定向 URI,因为它是 OIDC 认证过程中的一个关键安全组件。
什么是重定向 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 的方法:
启动登录时:
- 授权请求:你的应用程序将用户引导 至 OIDC 提供商的授权端点,包括
client_id
、response_type
、scope
和redirect_uri
等参数。 - 用户认证:用户在 OIDC 提供商处进行认证。
- 授权码传递:认证成功后,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
的授权码,请执行以下步骤:
-
提取授权码:从重定向 URI 的查询字符串中检索 code 参数。
-
用授权码交换令牌:构造到 OIDC 提供商令牌端点的 POST 请求,包括:
client_id
:应用程序在 OIDC 提供商中的 IDcode
:从重定向 URI 接收到的授权码code_verifier
:客户端生成的随机字符串redirect_uri
:在授权请求中使用的相同 URIgrant_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 简化开发工作。