android - 使用 native 应用程序 (Android) 保护 Oauth2 中的授权码

标签 android oauth-2.0 deeplink nativeapplication android-customtabs

这个问题与 AppLinks assetlinks.json appears not to be used for validation 几乎没有关系

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

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

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

授权码是一条敏感信息,因为它允许客户端获取访问 token 和刷新 token ,然后访问 protected 资源。

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

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

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

编辑

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

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

最佳答案

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

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)保证授权码的安全。您的服务器必须实现此功能以减少不需要的授权代码重播。 关于OAuth的一点提醒使用 PKCE 的授权步骤:

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

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

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

关于android - 使用 native 应用程序 (Android) 保护 Oauth2 中的授权码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51824549/

相关文章:

Android - 按下按钮单击问题后将 EditText 转换为 int

asp.net - 通过 WEB API 使用 ASP.NET Identity 进行本地登录

ios - 如何检测该应用程序正在从 safari 重定向打开?

oauth - tincan LRS/LMS 启动和 OAuth 的最佳实践

ios - 无法读取 AppDelegate 方法中的深层链接 URL(swift 4、iOS 13)

android - 如何在应用程序中创建深层链接?

android - 在 Android 应用程序 (HTML5 JavaScript PhoneGap) 中使用 NodeJS 是一个好的决定吗?

android gridlayout 未在模拟器 API 22 中显示

android - 如何使视频全屏并保持纵横比?

java - 改造 1.9 以使用 jhipster oauth 响应未填充