Skip to content

8.4. 在原生应用中接收授权响应

为了从浏览器处接收到授权响应,原生应用可以使用若干种重定向 URI。它们的可用性和用户体验因平台而异。

8.4.1. 接管 https 协议 URI 重定向

在某些操作系统上,应用能够在它们控制的域名下,接管 https 协议的 URI(见 [RFC9110] 第 4.2.2 节)。当浏览器遇到被接管的 URI 时,它不会加载这张页面。相对地,原生应用则会启动,并将该 URI 作为一个启动参数。

原生应用可以将这种 URI 作为重定向 URI。对于授权服务器而言,这些 URI 与常规的网络客户端重定向 URI 并无区别。下面是一个示例:

https://app.example.com/oauth2redirect/example-provider

由于仅靠重定向 URI 无法区分公共原生应用和机密网络客户端,第 8.1 节规定了一项必需的操作:在客户端注册过程中,记录客户端类型,以便服务器确定客户端类型,并依此行动。

相比起其它的原生应用重定向方法,应用接管的 https 协议重定向 URI 有一定的优势:操作系统能够向授权服务器保证目标应用的身份。因此,在可能的情况下,原生应用应该使用该方法,而不是其它方法。

8.4.2. 回环接口重定向

如果原生应用能够在回环网络接口上打开端口,并且不需要特殊权限(通常是桌面端操作系统上的特殊权限),那么它们可以使用回环接口接收 OAuth 重定向。

回环重定向 URI 使用 http 方案,并且由回环 IP 和客户端正在监听的端口组成。

即,对于 IPv4 是 http://127.0.0.1:{端口}/{路径},对于 IPv6 是 http://[::1]:{端口}/{路径}。下面是一个示例,使用了 IPv4 回环接口,以及一个随机分配的端口:

http://127.0.0.1:51004/oauth2redirect/example-provider

下面是一个示例,使用了 IPv6 回环接口,以及一个随机分配的端口:

http://[::1]:61023/oauth2redirect/example-provider

虽然使用 localhost 的重定向 URI 与回环 IP 重定向的工作方式类似,但是不建议使用 localhost。相比起 localhost,使用回环 IP 指定重定向 URI 避免了无意中监听回环接口以外的网络接口。这样也更不容易受到客户端防火墙和用户设备上配置错误的主机名解析的影响。

当申请回环 IP 重定向 URI 时,授权服务器必须允许任何端口被指定,以满足客户端从操作系统处获取临时可用端口的需要。

客户端不应该假定设备支持互联网协议的某一特定版本。建议客户端尝试同时使用 IPv4 和 IPv6 绑定回环接口。

8.4.3. 私用 URI 方案重定向

移动端和桌面端的许多计算平台都允许应用注册私用 URI 方案(有时俗称为“自定义 URL 方案”),例如 com.example.app,从而支持通过 URI 进行应用间通信。当浏览器或其它应用尝试加载私用 URI 方案的 URI 时,注册其的应用将被启动,以处理请求。

支持私用 URI 方案的许多环境都没有提供一种机制,来声明方案,并防止不同应用的方案冲突。因此,使用私用 URI 方案的客户端容易受到针对其重定向 URI 的潜在攻击。所以,只有当无法使用前面提到的、更安全的方法时,才应该使用该方法。

为了使用私用 URI 方案重定向进行授权请求,原生应用启动浏览器,提供标准的授权请求,但其中的重定向 URI 会利用它在操作系统中注册的私用 URI 方案。

当选择与应用关联的 URI 方案时,应用必须使用基于由其控制的域名的 URI 方案,并以相反顺序表示,如 [RFC7595] 第 3.8 节关于私有 URI 方案的建议。

例如,控制域名 app.example.com 的应用可以使用 com.example.app 作为其方案。某些授权服务器会根据域名分配客户端标识符,例如 client1234.usercontent.example.net。如果以同样的方式反转,它也可以用作方案的域名。但是,某些方案,例如 myapp,不符合这一要求,因为它不基于域名。

当同一位发布者发布多个应用时,必须注意每个方案在该组中都是唯一的。在使用基于反序域名的应用标识符的平台上,可以重复使用这些标识符,作为 OAuth 重定向的私用 URI 方案,以帮助避免这一问题。

根据 [RFC3986] 第 3.2 节的要求,由于私用 URI 方案重定向没有命名权威,方案组件后只出现一条斜线(/)。下面是一个完整的重定向 URI 示例,利用了私用 URI 方案:

com.example.app:/oauth2redirect/example-provider

在授权服务器完成请求后,它像通常一样,重定向到客户端的重定向 URI。由于重定向 URI 使用了私用 URI 方案,操作系统就会启动原生应用,并将 URI 作为启动参数传入。然后,原生应用对授权响应进行正常处理。

本站使用 Vitepress 构建