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

Posted

技术标签:

【中文标题】使用 Android 应用链接作为 OAuth2 重定向 URI【英文标题】:Use Android App Link as an OAuth2 Redirect URI 【发布时间】:2021-07-21 01:04:35 【问题描述】:

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

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

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

    AndroidManifest.xml 中提供了一个 IntentFilter 来处理应用链接,例如:
<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>
    https://my-app.com/.well-known/assetlinks.json 提供了有效的 assetlinks.json(此时,IntentFilterIntent 日志显示 JSON 验证成功,我可以使用类似 npx uri-scheme open https://my-app.com/callback 的命令从终端打开应用程序) 我的应用程序通过启动 CustomTabsIntent.launchUrl 来启动 OAuth2 流程,其 url 如下:
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:// 方案的有效处理程序?

如果上述方法是不可能的,有没有办法从 WebView 导航回 App,提供 auth_code 或唯一的方法是使用自定义方案?

【问题讨论】:

【参考方案1】:

原来&lt;data android:scheme="http" android:host="my-app.com/callback" /&gt; 是错误的,应该使用&lt;data android:scheme="http" android:host="my-app.com" android:path="/callback" /&gt; 而不是这个。 android:host 不应包含 path。我确认它在没有任何额外用户手势的情况下运行良好,就像它是一个普通的深层链接一样。浏览器实际上识别出这个 url 是一个声明的 url 并将响应转发给应用程序。

【讨论】:

【参考方案2】:

绝对可以(并且推荐)使用这样的声明的 HTTPS 方案,尽管我没有使用 WebView 这样做。

棘手的部分是如果没有用户手势(用户单击),重定向回应用程序将无法可靠地工作。用户体验和可靠性都有些棘手,您可能需要一个“插页式”互联网网页。

在移动 OAuth 中,建议使用 AppAuth Pattern,系统浏览器用于处理重定向,以便应用永远无法访问凭据。

有关更多详细信息,请参阅下面的代码示例,您可以在模拟器上运行该示例。示例链接到一些博客文章,其中讨论了优缺点,以便您查看此类解决方案是否符合您的喜好:

Code Sample

【讨论】:

谢谢,RFC 向我保证这是可能的。

以上是关于使用 Android 应用链接作为 OAuth2 重定向 URI的主要内容,如果未能解决你的问题,请参考以下文章

OAuth2 - 移动应用重定向问题,停留在浏览器中

可以使用 OAuth2 授权码作为成功登录的证明吗?

Rest API 中的 Spring Security Oauth2

使用spring boot app作为资源服务器,google oauth2作为授权服务器

微信企业号:OAuth2.0微信授权验证

OAuth2 原理概览