使用本机应用程序保护 Oauth2 中的身份验证代码 (Android)

2024-01-30

这个问题几乎与AppLinks assetlinks.json 似乎未用于验证 https://stackoverflow.com/questions/51327174/applinks-assetlinks-json-appears-not-to-be-used-for-validation

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

本机应用程序通过浏览器发起授权请求,然后接收包含授权码的授权响应。根据RFC6749#section-4.1.2 https://www.rfc-editor.org/rfc/rfc6749#section-4.1.2,代码在 URL 中传递:

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

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

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

但根据相关问题链接在顶部 https://stackoverflow.com/questions/51327174/applinks-assetlinks-json-appears-not-to-be-used-for-validation,Android 上的应用程序链接似乎不是 100% 安全,因为操作系统可能不会验证 https 方案。

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

EDIT

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

注意:SSO-Cookie 是指使用自定义选项卡 https://github.com/openid/AppAuth-Android在 Android 上进行 SSO。


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

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

话虽这么说,其实这就是代码交换证明密钥 (PKCE) https://www.rfc-editor.org/rfc/rfc7636从而保证了安全授权码。你的服务器must实现此功能是为了减少不必要的授权码重播。 关于的一点小提醒OAuth https://www.rfc-editor.org/rfc/rfc6749授权步骤使用PKCE :

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

这就是如何PKCE确保做出该操作的客户/authorization请求是同一个客户端/token要求。因此,即使第三方应用程序捕获了您的授权码它不能用它来检索访问令牌.

欲了解更多信息,请参阅:PKCE(rfc 7636) https://www.rfc-editor.org/rfc/rfc7636 and 适用于本机应用程序的 OAuth 2.0 (rfc 8252) https://www.rfc-editor.org/rfc/rfc8252

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用本机应用程序保护 Oauth2 中的身份验证代码 (Android) 的相关文章

随机推荐

  • 如何处理跨线程访问异常?

    在 WPF 中使用多线程时可能出现的一个常见异常是 调用线程无法访问该对象 因为另一个线程拥有它 有哪些选择可以正确处理这个问题 根据情况有多种选择 从另一个线程访问控件 e g updating a TextBlock with prog
  • 使用 Java 驱动程序获取 Mongo 实例的版本

    正如标题所示 我想获取客户端连接的 mongo 实例的版本 目前我使用的是 mongo java 驱动程序 2 9 3 mongo 实例是 2 2 2 我需要这个 以便支持两者 pushAll and push with each函数 因为
  • 尽管版本是托管的,为什么我会由于缺少 dependency.version 而得到无效的 pom?

    我有一个看起来像这样的案例 super 第三方依赖管理 父pom 超级的孩子 projectA 父母 pom 的孩子 对第三方的依赖 projectB 父母 pom 的孩子 对项目A的依赖 项目 A 构建得很好 但是当我尝试编译项目 B 时
  • Django 将页面限制为某些用户

    我开始尝试在我正在开发的网站上实现用户 也许这不是一个好方法 因为我是 django 的新手 到目前为止 我有一个简单的模板检查 可以为不同的人提供不同的链接 extends base htm block content if user u
  • QuickCheck 实例属于 cabal 包中的什么位置?

    我有一个阴谋集团包 https github com acfoltzer nbt导出一个类型NBT https github com acfoltzer nbt blob master src Data NBT hs这可能对其他开发人员有用
  • 事件冒泡和事件捕获有什么用? [复制]

    这个问题在这里已经有答案了 事件冒泡和事件捕获有什么用 如果您单击一个元素 例如页面上结构如下的链接 BODY DIV A 那么不仅 A 得到了 onclick 事件 它下面的所有元素也得到了 onclick 事件 第一轮是捕获阶段 从下到
  • Moq + 单元测试 - System.Reflection.TargetParameterCountException:参数计数不匹配

    我试图将 lambda 与多个参数函数一起使用 但当我尝试调用时 Moq 在运行时抛出此异常mock Object Convert value null null null line System Reflection TargetPara
  • Spring JPA PostgreSQL + MongoDB

    从 Spring 示例开始使用 REST 访问 MongoDB 数据 https spring io guides gs accessing mongodb data rest https spring io guides gs acces
  • 如何从 jpeg 图像中提取彩色点的坐标?

    我正在尝试使用 R 测量感兴趣的对象之间的距离 在本例中是树木的年轮 我之前的尝试 https stackoverflow com questions 8832810 r imagej measuring shortest distance
  • 对元组列表中的每个值求和

    我有一个与此类似的元组列表 l 1 2 3 4 5 6 7 8 9 0 我想创建一个简单的单行代码 它将给出以下结果 r 25 20 or r 25 20 don t care if tuple or list 这就像执行以下操作 r 0
  • React 测试库 - 避免 getBy?

    当使用 React 测试库测试组件时 我发现自己从getBy 有时需要将其替换为queryBy 例如 如果我需要检查某个元素是否不存在 我的测试最终混合了getBy and queryBy 我最近刚刚使用queryBy对于一切 这让我思考
  • 在 Android 中禁用声音安全级别通知

    在我的 android 应用程序中 我需要提高音量 当我提高音量时 我会收到如下通知 将音量提高到安全水平以上 长时间高音量收听可能会损害您的听力 如何禁用此功能 此限制已融入 Android 操作系统中 因此该解决方案几乎是通用的 您需要
  • 针对不同安装类型(服务器/客户端)的 Inno Setup 子选项/子组件

    我正在尝试使用服务器和客户端安装类型为我的应用程序准备设置 服务器类型很容易使用一些代码 但客户端安装也有很多选项 我正在尝试创建一个带有类型选择的页面 如果用户选择客户端安装 则还有许多其他选择 是否可以 Example Server 无
  • 如何按最大日期获取某些列的行?

    我想在列时获取最新列I and II是相同的 所以结果应该是 1 30 2017击败1 27 2017 I I III IV A X 1 30 2017 9 33 00 AM some data A Y 1 30 2017 9 33 00
  • 为什么选择 MVC 而不是优秀的旧式 ASP.NET?还是不明白为什么我应该走这条路?

    我知道这个问题之前已经被问过 并且我阅读了所有答案 但他们仍然没有给我我正在寻找的答案 我需要一些具体的东西 我自愿向我们组中的其他开发人员进行 MVC 演示 这迫使我学习它 每个人都面临的一个大问题是 MVC 可以带来哪些我们在 ASP
  • android:无法停止活动

    我是安卓新手 我有一个登录活动 它验证用户编号 然后启动 搜索活动 在运行时 我看到搜索活动出现 在验证用户之后 但 Android 在停止登录活动时遇到问题 我收到 java lang runtimeException 无法停止活动 co
  • 为什么 EditorTemplate 不显示数据?

    我重写了我的页面以使用 EditorTemplates 他们非常友善 但是 当我回发时 仅第一行回发数据 其他 4 行显示为空 FormSection 有一个 FormRowModel 列表 FormRows 有一个 CtrlInputDa
  • c中int64的十进制到十六进制

    为什么这段代码不起作用 include
  • 从命名空间到子域?

    我想要做的是将命名空间路由与子域路由相匹配 例如在我的routes rb中我有 namespace group do resources groups resources clubs end 组索引和每个组的当前路径如下 lvh me gr
  • 使用本机应用程序保护 Oauth2 中的身份验证代码 (Android)

    这个问题几乎与AppLinks assetlinks json 似乎未用于验证 https stackoverflow com questions 51327174 applinks assetlinks json appears not