使用 Android 应用程序链接作为 OAuth2 重定向 URI

2024-01-19

是否可以使用 Android 应用程序链接,从https://例如:https://my-app.com/callback在 OAuth2 流程结束时从 Android WebView 重定向回我的应用程序?我知道正常的深度链接是如何工作的,例如com.my-app:// or my-app://可用于重定向回我的应用程序。根据我的理解,WebView 不知道如何处理此类协议,将请求传递给操作系统,然后操作系统将请求传递给我的应用程序,如果在中提供了足够的 IntentFilter,则该应用程序处理此 urlAndroidManifest.xml.

这可以通过https://方案或重定向将始终被 WebView 捕获,并且无法重定向回我的应用程序?

指定我想要通过步骤实现的目标:

  1. 中提供了一个 IntentFilterAndroidManifest.xml处理应用程序链接,例如:
<intent-filter android:autoVerify="true">
 <action android:name="android.intent.action.VIEW" />
 <category android:name="android.intent.category.DEFAULT" />
 <category android:name="android.intent.category.BROWSABLE" />
 <data android:scheme="http" android:host="my-app.com/callback" />
 <data android:scheme="https" />
</intent-filter>
  1. A valid assetlinks.json提供于https://my-app.com/.well-known/assetlinks.json(此时,IntentFilterIntent日志显示 JSON 验证成功,我可以使用如下命令从终端打开应用程序npx uri-scheme open https://my-app.com/callback)
  2. 我的应用程序通过启动来启动 OAuth2 流程CustomTabsIntent.launchUrl网址如下:
https://accounts.google.com/o/oauth2/v2/auth?
 scope=email%20profile&
 response_type=code&
 state=state&
 redirect_uri=https://my-app.com/callback&
 client_id=client_id

完成这些步骤后,我希望我的应用程序在成功登录后打开,因为它是 url 的有效处理程序,并且不希望卡在浏览器中。这可能吗,或者请求永远不会从浏览器转发到操作系统,因为浏览器是有效的处理程序https:// scheme?

如果上述不可能,有没有办法从 WebView 导航回应用程序,提供auth_code或者做到这一点的唯一方法是使用自定义方案?


专门针对 Android 12 及更高版本

  • 在 Android 12 中,Google 改变了解决 Web Intent 的方式。如果您的目标是 Android 12 或更高版本,则需要实现特定功能。了解更多相关信息HERE https://developer.android.com/about/versions/12/behavior-changes-all#web-intent-resolution

OAuth 最佳实践

  • 如中所述互联网工程任务组针对本机应用程序的 OAuth 2.0 https://www.rfc-editor.org/rfc/rfc8252:

For authorizing users in native apps, the best current practice is to perform the OAuth authorization request in an external user-agent(typically the browser) rather than an embedded user-agent (such as one implemented with web-views

  • 您的申请应该NOT使用 Android WebView。相反,使用隐式意图将用户重定向到浏览器进行登录

重定向URI

  • 在意图过滤器内定义重定向 URI 时,它们应该遵循这个图案 https://developer.android.com/guide/topics/manifest/data-element: <scheme>://<host>:<port>[<path>|<pathPrefix>|<pathPattern>|<pathAdvancedPattern>|<pathSuffix>]
  • 如果您的重定向 URI 为https://my-app.com/callback。意图过滤器将是:
<intent-filter>
  <action android:name="android.intent.action.VIEW" />
  <category android:name="android.intent.category.DEFAULT" />
  <category android:name="android.intent.category.BROWSABLE" />
  <data
   android:host="my-app.com"
   android:scheme="https"
   android:path="/callback"
   />
</intent-filter>

Example

  • 我写了一篇博文,HERE https://dev.to/theplebdev/oauth20-and-android-login-with-github-and-get-the-authorization-code-40n3,关于在 Android 中使用 OAuth 与 GitHub API
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 Android 应用程序链接作为 OAuth2 重定向 URI 的相关文章

  • 主题以编程方式设置。如何重新加载 Activity 来应用

    如何在不重新启动整个应用程序的情况下应用主题 如果我这样做startActivity getIntent finish 活动退出并且不重新启动 是否可以简单地重新启动 重新创建活动来应用主题 它的顺序不正确 finish intent ne
  • RecyclerView 未显示列表中的所有项目

    我在用RecyclerView在我的应用程序中 每次我打开屏幕时 我只能看到一项 但当我调试时 它每次都会出现onBindViewHolder method 这是我的适配器 Override public ViewHolder onCrea
  • PHP服务器端IAB验证openssl_verify总是返回0

    我使用以下函数 服务器端 php 来验证 IAB v3 事务 我从 Android 应用程序传递过来 Override protected void onActivityResult int requestCode int resultCo
  • Android STFP 库 [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我想在我的 Android 项目中使用 SFTP 安卓已经有了吗 SFTP 库 还是我必须实现它 I
  • 居中复选框视图

    如果除了 或代替 复选框之外 您还对单选按钮感兴趣 请参阅this https stackoverflow com questions 16701806 centering views 2而是提问 尽管存在
  • IntentService、Service 或 AsyncTask

    实现这一点的最佳方法是什么 我有一个 Android 应用程序 它将使用我的 python 服务器来允许两部手机之间进行轮流通信 回合意味着他们在一轮开始之前不能互相交谈 一旦他们发送一条消息 他们就不能发送另一条消息 直到对方做出回应 然
  • Android浏览器上的Web应用程序宽度问题

    所以到目前为止我只在 Android 浏览器上遇到过这个问题 基本上我的网站几乎一直运行良好 而且我还没有在 Dolphin Opera 或 Skyfire 上看到这个问题 但偶尔当我从手机主屏幕之一上的书签重新打开 Android 浏览器
  • Android Accessibility 执行触摸操作

    我想知道是否可以使用 Android 辅助功能服务在屏幕上的位置执行触摸操作 例如 Bundle arguments new Bundle arguments putInt coord X X value arguments putInt
  • Android相当于javascript的setTimeout和clearTimeout?

    setTimeout 有一个答案https stackoverflow com a 18381353 433570 https stackoverflow com a 18381353 433570 它没有提供我们是否可以像在 JavaSc
  • 如何找到特定路线上两点之间的距离?

    我正在为我的大学开发一个 Android 应用程序 可以帮助学生跟踪大学巴士的当前位置 并为他们提供巴士到达他们的预计时间 截至目前 我获取了公交车的当前位置 通过公交车上的设备 和学生的位置 我陷入了必须找到两个 GPS 坐标之间的距离的
  • opencv人脸检测示例

    当我在设备上运行应用程序时 应用程序崩溃并显示以下按摩 java lang UnsatisfiedLinkError 无法加载 detector based tracker findLibrary 返回 null 我正在使用 OpenCV
  • 返回主要活动(意图)时传递数据我做错了什么?

    我是安卓新手 这可能是最简单的问题 但我不明白这里出了什么问题 我试图创建一个通过意图传递值的基本示例 因此 当我关闭第二个活动时 我需要将数据传递到主活动 这是代码 意图测试1 主要活动 public void onClick View
  • 如何在虚拟机 VirtualBox 上运行 Android-x86 4.2 iso?

    我想用Android x86测试和调试我的应用程序 我之前成功尝试过其他版本的Android x86 但是关于android x86 4 2有一个错误 所以我在这里问我的问题 因为它可能会发生在其他人身上 我安装了oracle VM vir
  • twitter4j => AndroidRuntime(446): java.lang.NoClassDefFoundError: twitter4j.http.AccessToken

    我正在尝试使用 twitter4j 我的应用程序来连接并发布到 Twitter 我正在关注本教程 http blog doityourselfandroid com 2011 02 13 guide to integrating twitt
  • 如何从webkit浏览器中检测Android版本和品牌?

    如何通过webkit浏览器检测Android版本和品牌 可靠吗 我相信你可以检查用户代理 但是 我认为它不安全 因为有很多方法可以用来欺骗用户代理 在谷歌上搜索这个问题给了我们很多答案 它甚至可以在默认浏览器上运行 您只需输入 about
  • 与 Dagger 一起使用时,Espresso 生成 FileNotFoundException

    我一直在研究旧版 Android 应用程序 尝试为其添加测试和适当的架构 该应用程序有一个主要LaunchActivity它在启动时运行一系列检查 最初 该活动使用 Dagger 来 注入依赖项 活动将使用它来运行检查 但效果相当糟糕 我转
  • BadPaddingException:无效的密文

    我需要一些帮助 因为这是我第一次编写加密代码 加密代码似乎工作正常 但解密会引发错误 我得到的错误是 de flexiprovider api exceptions BadPaddingException 无效的密文 in the 解密函数
  • 获取当前图片在图库中显示的位置

    在我的应用程序中 我有一个图片库 但我想检测当前显示图像的位置 例如 当我启动我的活动时 位置是 0 但是当我在图库中滚动时 我想获取当前显示图像的位置 我尝试过 OnFocusChanged OnItemClicked 但只有当我单击图库
  • SQLiteDatabase.openDatabase 与 SQLiteOpenHelper.getReadableDatabase

    这两种方法有什么区别吗 两者都返回一个打开的 SQLiteDatabase 如果数据库不存在 两者都可以创建数据库 当需要读 写时 SQLiteOpenHelper 还具有 getWriteableDatabase 我应该使用哪种方法以及在
  • Android中绑定适配器有什么用?

    我一直在阅读有关Android中绑定适配器的文章 但我似乎不明白它 何时使用绑定适配器 有人可以用一个简单的例子来解释它吗 我读过的一篇文章在主活动中有一个绑定适配器 绑定适配器有一个参数 toastMessage 显然 只要 toastM

随机推荐

  • ViewPager 或 ScrollView 中的 WebView - Android 3.0+ 上奇怪的渲染错误

    我有一个 ViewPager ViewPager的每一页都是一个ScrollView ScrollView 包含一个 WebView 和几个其他视图 在 Android 2 3 及更早版本上一切正常 但在 3 0 上有一个奇怪的渲染问题 在
  • 制作远程 git 存储库的本地副本

    我对版本控制的术语或实践和程序不是很熟悉 这就是我想做的 我想从互联网上的 git 存储库下载一个文件夹 克隆是正确的方法吗 克隆不会保留不必要的元数据文件吗 有没有办法进行 干净 下载 我想设置一个包含此文件夹的本地存储库 我现在可以在其
  • 当ant运行在JDK1.6中时如何将类编译到JDK1.5

    我的开发环境运行在JDK1 6中 我需要编译一些类 以便它们与运行JDK1 5的客户端兼容 我该如何使用 javac ant 目标来做到这一点 命令行 javac target 1 5 源文件 Ant lt javac srcdir src
  • 在 Java 中通过套接字发送图像的有效方法

    我是一个 Java 菜鸟 我已经阅读了一些有关套接字的基础知识 并且我可以使用 ImageIO 通过套接字成功发送图像 但我想减少发送的数据量 最终 我希望以尽可能小的文件大小尽快发送图像 屏幕截图 现在 我已经这样设置了 imageIO
  • 使用核心数据插入/更新记录的最有效方法?

    我正在开发一个定期从服务器下载数据的应用程序 如果数据需要更新 我会使用类似以下内容来更新记录或插入新记录 如果不存在 let fetchRequest NSFetchRequest
  • Android 中 Paint.StrokeWidth = 1 的绘制线问题

    我想我遇到了一个讨厌的错误 问题是几乎水平的线 带有轻微的渐变并使用 StrokeWidth 1 的 Paint 则不是 绘制 例如 public class MyControl extends View public MyControl
  • 版本号格式的正则表达式

    您能帮我提供以下版本号格式的正则表达式吗 例如2013年1月10日 您可以按照数字 点 数字 点 数字 连字符 数字的模式对数字进行简单匹配 因为groovy 使用 java 引擎 http docs groovy lang org lat
  • 从列表框中删除项目会导致灾难性故障?

    我正在尝试清除 Windows RT 应用程序中列表框的项目 要添加项目 我使用 List
  • Gradle 项目的自定义条件配置

    摘录自https github com gradle gradle blob master build gradle https github com gradle gradle blob master build gradle ext i
  • 理解 strlen 实现中的代码[重复]

    这个问题在这里已经有答案了 我有两个关于实施的问题strlen in string h在 glibc 中 该实现使用带有 漏洞 的幻数 我无法理解这是如何工作的 有人可以帮我理解这个片段吗 size t strlen const char
  • 如何隐藏 WPF 组合框中的所选项目?

    我想从打开的 WPF 组合框中隐藏所选项目 基本上是为了显示而不是这样 item2 item1 item2 item3 this item2 item1 item3 如何才能做到这一点 为什么不更改所选项目的可见性呢
  • 如何从活动中调用服务的方法?

    我只想从我的活动中调用本地服务的方法 我怎样才能做到这一点 这是一个可能有帮助的示例 服务器 java package com example bindservice binder import java text SimpleDateFo
  • 如何计算数据子集中唯一字符向量的数量

    这是我的数据集的示例 Dput 已删除 我使用以下代码按月对这个数据框进行子集化 simpleindoor mean lt simple trapindoors gt group by month gt summarise n n mean
  • 如何从构建脚本(build.rs)访问当前的货物配置文件(调试/发布,...)

    在嵌入式项目中 我通常使用 qemu 运行调试模式 但需要为具体的微控制器构建版本 build rs 需要知道实际模式是什么 调试或发布 才能生成正确的内存布局 build rs 如何做出这个决定 有关的 如何从构建脚本 build rs
  • “删除”是否可以与多态性一起正常工作? [复制]

    这个问题在这里已经有答案了 BaseClass p new DerivedClass delete p 我知道如果基类没有虚拟析构函数 第二行将调用基类的析构函数 如果有 则第二行将调用派生类的析构函数 但会delete正确释放内存 假设B
  • Xlib XGetWindowProperty 返回零项

    我在读取某些 XWindow ICCCM 属性时遇到问题 问题实际上是当我尝试读取 NET WM STATUS 属性时 我正在使用的功能是 int get property value Display display Window wind
  • 如何在 vaadin 网格中显示复选框而不是布尔值?

    我正在尝试将我的布尔值显示为 vaadin 网格中的复选框 我无法使用多选模式 因为我需要两列带有复选框 复选框外壳的列有标题 但复选框本身外壳没有标题 有人有想法吗 我建议使用这个仓库https github com vaadin gri
  • 除了ant之外,java最好的构建工具是什么?

    不知怎的 我不太喜欢IDE 但我还没有找到一个特别好的工具来从源代码构建java应用程序 我欢迎各种反馈 Maven 是另一种选择 但我不知道我是否会称其为 最佳 如果使用得当 Ant 的优点是简单 我发现 Maven 更重并且更难穿透
  • 不带命名空间的 Python XpathEvaluator

    我需要编写一个动态函数来查找 ATOM xml 文档子树上的元素 为此 我写了这样的内容 tree etree parse xmlFileUrl e etree XPathEvaluator tree namespaces def http
  • 使用 Android 应用程序链接作为 OAuth2 重定向 URI

    是否可以使用 Android 应用程序链接 从https 例如 https my app com callback在 OAuth2 流程结束时从 Android WebView 重定向回我的应用程序 我知道正常的深度链接是如何工作的 例如c