首页 > 解决方案 > OAuth2 回调在某些设备上的浏览器内启动活动

问题描述

我已经在 Android 应用程序中为 Coinbase 实现了 OAuth2。应用流程如下。用户单击“与 Coinbase 的链接”按钮,调用 OAuth2 端点https://www.coinbase.com/oauth/authorize。然后系统浏览器打开 Coinbase OAuth 页面,要求用户登录并授权应用程序。完成此操作后,应用程序将通过自定义 URI 方案回调:

<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:scheme="myapp" android:pathPrefix="/coinbase-oauth" />
</intent-filter>

在带有此过滤器的活动中,与用户启动初始 OAuth 流程的活动相同,该onNewIntent(Intent intent)方法称为通过意图获取代码并通过获取令牌来完成授权。这是首选方式,也是我们希望 OAuth 的行为方式,一切都很好。

但是,在某些设备上,BROWSABLE活动是在浏览器中重新创建的。我们到达onCreate()了活动,也可以从意图中获取 OAuth 代码,但是,我无法重新进入应用程序。启动浏览器进行授权的初始活动仍在后台等待响应。新创建的活动版本本质上是解耦的。虽然它可以完成工作,但我希望用户重新使用该应用程序。

标签: androidoauthoauth-2.0url-redirection

解决方案


问题不在于您需要回调到启动身份验证过程的同一活动。我认为 Coinbase API 不打算使用这种方式。

要解决此问题,只需singleInstance通过将以下属性添加到活动标记来指定活动的启动模式。

android:launchMode= "singleInstance"

有关更多详细信息,请参阅文档


推荐阅读