允许本机应用程序的 OAuth 2.0 重定向 URI

Allowed OAuth 2.0 Redirect URIs for Native App

我正在开发具有环回接口重定向的 OAuth 本机应用程序,并尝试协调 RFC6749(OAuth 2.0 授权框架)与 RFC8252(本机应用程序的 OAuth 2.0):

在 RFC6749 中,规范要求使用绝对 URI 作为客户端的重定向端点(第 3.1.2 部分):

The redirection endpoint URI MUST be an absolute URI ... The endpoint URI MUST NOT include a fragment component.

然而,这在RFC8252中似乎有一个例外。规范指出任何端口都可以用于环回 IP 重定向 URI(第 7.3 节):

The authorization server MUST allow any port to be specified at the time of the request for loopback IP redirect URIs, to accommodate clients that obtain an available ephemeral port from the operating system at the time of the request.

并表示将支持环回 IP 重定向 URI (Appendix A.):

OAuth servers that support native apps must: ...

  1. Support loopback IP redirect URIs. This is required to support desktop operating systems.

RFC8252 还提供了注册说明(8.4 部分):

Authorization servers MUST require clients to register their complete redirect URI (including the path component) and reject authorization requests that specify a redirect URI that doesn't exactly match the one that was registered; the exception is loopback redirects, where an exact match is required except for the port URI component.

因此,我了解到 OAuth 2.0 授权服务器与本机应用程序客户端的正确行为是:

  1. 需要注册环回重定向 URI(即 http://127.0.0.1/oauth2redirect/example-provider),可能需要使用通配符端口 :*
  2. 在对 /authorize 的 GET 请求中,将 redirect_uri 请求参数与注册的 URI 匹配,但是 允许指定任何端口(即。 http://127.0.0.1:61023/oauth2redirect/example-provider 将被接受)

我在这里遗漏了什么吗?这是具有已注册本机应用程序的 OAuth 2.0 授权服务器的预期行为吗?

对于桌面应用程序,通常的做法是在运行时找到一个空闲端口,然后在 URL 启动一个环回服务器,例如 http://localhost:8000,没有任何路径。此侦听器的存在只有一个原因,即接收登录响应。

理论上,您可以将 http://localhost 注册为客户端的重定向 URI,并且任何端口都可以使用,但我很少看到授权服务器支持它。

这里有一些 example code of mine 来展示 looks.My 应用程序如何为端口 8001-8003 注册三个特定的重定向 URLs。

你是对的,只应注册准确的 URLs,以避免打开重定向器漏洞。桌面应用程序和多个端口的 RFC8252 行为是一种特殊情况。您可以选择使用它,也可以使用不同的端口注册多个重定向 URI。

另一个选择是对桌面应用程序使用私有 URI 方案(我个人更喜欢这个)。移动应用程序应使用 HTTPS 重定向 URI,作为最安全的选项 - 这是 required for financial-grade apps