是否可以使用以
https://
开头的 Android 应用程序链接(例如:https://my-app.com/callback
)在 OAuth2 流程结束时从 Android WebView 重定向回我的应用程序?我知道正常的深层链接如何工作,例如 com.my-app://
或 my-app://
可用于重定向回我的应用程序。根据我的理解,WebView 不知道如何处理此类协议,将请求传递给操作系统,然后操作系统将请求传递给我的应用程序,如果 AndroidManifest.xml
中提供了足够的 IntentFilter,则该应用程序处理此 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>
assetlinks.json
处提供了有效的 https://my-app.com/.well-known/assetlinks.json
(此时,IntentFilterIntent
日志显示 JSON 验证成功,我可以使用类似 npx uri-scheme open https://my-app.com/callback
的命令从终端打开应用程序)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
或者唯一的方法是使用自定义方案?
事实证明
<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,并将响应转发给应用程序。
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。相反,使用隐式意图将用户重定向到浏览器进行登录
<scheme>://<host>:<port>[<path>|<pathPrefix>|<pathPattern>|<pathAdvancedPattern>|<pathSuffix>]
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>
示例棘手的部分是,如果没有用户手势(用户单击的手势),重定向回应用程序将无法可靠地工作。用户体验和可靠性都有点棘手,您可能需要一个“插页式”互联网网页。
在移动 OAuth 中,建议使用
AppAuth 模式,其中系统浏览器用于处理重定向,以便应用程序永远无法访问凭据。
有关更多详细信息,请参阅下面的代码示例,您可以在模拟器上运行该代码示例。该示例链接到一些博客文章,其中讨论了优点和缺点,以便您可以了解这种类型的解决方案是否符合您的喜好: