使用本机应用程序保护 Oauth2 中的授权码 (Android)

Secure the Auth Code in Oauth2 with native apps (Android)

这个问题与AppLinks assetlinks.json appears not to be used for validation

几乎没有关系

我正在 Android 上实施 Oauth2 应用程序。我想进行 SSO(单点登录)并且我担心 AppLink 无法保护授权码。

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

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

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

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

完成

但根据相关问题linked at the top,Android 上的应用程序链接似乎不是 100% 安全的,因为 OS 可能无法验证 https 方案。

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

编辑

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

注意:SSO-Cookie 是指使用 CustomTab 在 Android 上执行 SSO。

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

Settings > Apps > choose the application which can handle the Authorization Code link > Open by default > Open supported links in this app > choose Always allowThis way a third party application can catch the information contained in your link, in your case the Authorization Code.

话虽这么说,但保证授权码安全的其实是Proof Key for Code Exchange (PKCE)。您的服务器 必须 实现此功能以减少不需要的 授权码 重播。 关于使用 PKCEOAuth 授权步骤的一点提醒:

  1. 客户端(应用程序)调用 /authorization 端点,使用经过哈希处理的随机字符串和用于对其进行哈希处理的方法。客户端保留随机字符串(未散列),因为它将在步骤 3 中使用。
  2. 授权服务器检查用户是否输入了权限login/password。如果一切正常,它会存储散列的随机字符串及其在请求中发送的散列方法。然后,服务器使用包含 授权码 .
  3. 的重定向将用户代理重定向到应用程序
  4. 为了检索它的访问令牌,客户端(应用程序)使用在步骤 1 中生成的随机字符串调用 /token 端点。
  5. 服务器收到/token请求,提取随机字符串并用步骤2中存储的方法对其进行散列。然后服务器必须检查这个散列字符串与步骤 2 中存储的匹配。如果字符串相同,则服务器响应 Access TokenRefresh Token,否则响应错误。

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

有关详细信息,请参阅:PKCE (rfc 7636) and OAuth 2.0 for Native Apps (rfc 8252)