4

该问题与 AppLinks 几乎没有关系,assetlinks.json 似乎不用于验证

我正在 Android 上实现 Oauth2 应用程序。我想做 SSO(单点登录),我担心 AppLink 以保护 Autorization 代码。

原生应用通过浏览器发起授权请求,然后接收包含授权码的授权响应。根据RFC6749#section-4.1.2,代码在 URL 内传递:

Location: https://client.example.com/cb?code=SplxlOBeZQQYbYS6WxSbIA&state=xyz

授权码是一条敏感信息,因为它允许客户端获取访问令牌和刷新令牌,然后访问受保护的资源。

为了保护该代码,本机应用程序必须实现 https 方案重定向(RFC8252#section-7.2section-8.1)。在 Android 上,这必须使用assetlinks.json 文件来完成

但根据顶部链接的相关问题,Android 上的应用链接似乎不是 100% 安全的,因为操作系统可能不会验证 https 方案。

在这种情况下,我们应该如何实现 Oauth2 授权代码挂钩?

编辑

根据@benjamin anwser 的说法,AppLink 不是为了安全。但是,相关的威胁用例如下:安装了恶意应用程序并使用“SSO Cookie”获取Auth Code并交换AT+RT. 在我看来,这个过程中没有任何东西可以阻止这种情况:如果 applink 不是为了安全,授权服务器如何知道这个应用程序是恶意应用程序?

注意:我所说的 SSO-Cookie 是指使用CustomTab在 Android 上进行 SSO。

4

1 回答 1

4

保证安全的不是 AppLinks 功能。当您配置/.well-known/assetlinks.json文件时,它允许透明重定向到应用程序而无需任何用户交互。这意味着通常出现的用于选择用户希望使用哪个应用程序来处理链接的模式对话框不会弹出。正如您所说,如果用户选择处理您与另一个应用程序的链接或您的应用程序尚未安装,则可以绕过此机制。用户需要转到电话设置才能实现此目的:

设置>应用程序>选择可以处理授权码链接的应用程序>默认打开>在此应用程序中打开支持的链接>选择始终允许这样第三方应用程序可以捕获您的链接中包含的信息,在您的情况下是授权码.

话虽如此,实际上是代码交换证明密钥(PKCE)保证了授权代码的安全性。您的服务器必须实现此功能以减少不需要的授权代码重播。关于使用PKCE的OAuth授权步骤的一点提醒:

  1. /authorization客户端(应用程序)使用散列随机字符串和用于散列它的方法调用端点。客户端保留随机字符串(未散列),因为它将在步骤 3 中使用。
  2. 授权服务器检查用户是否输入了正确的登录名/密码。如果一切顺利,它会存储散列的随机字符串和在请求中发送的散列方法。然后,服务器使用包含Authorization Code的重定向将用户代理重定向到应用程序。
  3. 为了检索它的Access Token/token ,客户端(应用程序)使用步骤 1 中生成的随机字符串调用端点。
  4. 服务器接收/token请求,提取随机字符串并使用步骤 2 中存储的方法对其进行哈希处理。然后服务器必须检查此哈希字符串是否与步骤 2 中存储的字符串匹配。如果字符串相同,则服务器响应Access TokenRefresh Token,否则出错。

这就是PKCE确保发出/authorization请求的客户端与发出请求的客户端相同的方式/token。因此,即使第三方应用程序捕获了您的授权代码,它也无法使用它来检索访问令牌

有关更多信息,请参阅:PKCE (rfc 7636)适用于本机应用程序的 OAuth 2.0 (rfc 8252)

于 2018-08-17T10:04:05.290 回答