【问题标题】:Secure the Auth Code in Oauth2 with native apps (Android)使用本机应用程序 (Android) 保护 Oauth2 中的身份验证代码
【发布时间】:2018-08-13 14:20:49
【问题描述】:

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

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

本机应用程序通过浏览器发起授权请求,然后接收包含授权码的授权响应。根据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 文件来完成

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

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

编辑

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

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

【问题讨论】:

    标签: android oauth-2.0 deeplink nativeapplication android-customtabs


    【解决方案1】:

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

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

    话虽如此,实际上是Proof Key for Code Exchange (PKCE) 保证了授权码的安全性。您的服务器必须实现此功能,以减少不需要的授权码重播。 关于使用 PKCEOAuth 授权步骤的一点小提示:

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

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

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

    【讨论】:

    • 我同意你关于 PKCE 的观点,并且我非常了解相应的 RFC。但我的用例如下:安装了恶意应用程序并使用“SSO Cookie”获取验证码并将其交换为 AT+RT。在我看来,这个过程中没有任何东西可以阻止这种情况。通过 SSO-Cookie,我的意思是使用 CustomTab 在 Android 上进行 SSO。
    猜你喜欢
    • 2020-08-20
    • 2018-09-11
    • 2016-07-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-07
    相关资源
    最近更新 更多