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

问题描述 投票:0回答:3

是否可以使用以

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

这可以通过

https://
方案来完成吗?还是重定向将始终被 WebView 捕获,并且无法重定向回我的应用程序?

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

  1. 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>
  1. assetlinks.json
    处提供了有效的
    https://my-app.com/.well-known/assetlinks.json
    (此时,
    IntentFilterIntent
    日志显示 JSON 验证成功,我可以使用类似
    npx uri-scheme open https://my-app.com/callback
    的命令从终端打开应用程序)
  2. 我的应用程序通过启动
    CustomTabsIntent.launchUrl
    来启动 OAuth2 流程,网址如下:
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 导航回应用程序,提供

auth_code
或者唯一的方法是使用自定义方案?

android oauth-2.0 deep-linking applinks android-app-links
3个回答
1
投票

事实证明

<data android:scheme="http" android:host="my-app.com/callback" />
是错误的,应该使用
<data android:scheme="http" android:host="my-app.com" android:path="/callback" />
来代替。
android:host
绝不应包含
path
。我确认它运行良好,无需任何额外的用户手势,就像它是一个普通的深层链接一样。浏览器实际上识别出该 url 是已声明的 url,并将响应转发给应用程序。


1
投票

专门针对 Android 12 及更高版本

  • 在 Android 12 中,Google 改变了 Web 意图的解析方式。如果您的目标是 Android 12 或更高版本,则需要实现特定功能。了解更多相关信息这里

OAuth 最佳实践

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 时,它们应遵循
  • 此模式<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" ndroid:path="/callback" /> </intent-filter>
示例


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

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

在移动 OAuth 中,建议使用

AppAuth 模式,其中系统浏览器用于处理重定向,以便应用程序永远无法访问凭据。

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

  • 代码示例
© www.soinside.com 2019 - 2024. All rights reserved.