android - 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 代码,但是,我无法重新进入应用程序。启动浏览器进行授权的初始活动仍在后台等待响应。新创建的活动版本本质上是解耦的。虽然它可以完成工作,但我希望用户重新使用该应用程序。
解决方案
问题不在于您需要回调到启动身份验证过程的同一活动。我认为 Coinbase API 不打算使用这种方式。
要解决此问题,只需singleInstance
通过将以下属性添加到活动标记来指定活动的启动模式。
android:launchMode= "singleInstance"
有关更多详细信息,请参阅文档。
推荐阅读
- javascript - 可以使用元组,用 request.user 解构,django?
- python - 如何在 Selenium Python 中更改比例或 srcoll
- python - 找到正确的数字顺序 - Python 3.7
- vue.js - Vue js + 获取服务工作者注册对象的麻烦
- deep-learning - ValueError:未知初始化程序:GlorotUniform
- amazon-web-services - AWS 是否对轮询 DynamoDB 流收费?
- c# - NuGet For Unity 下载包并有错误
- html - 由于画布,无法单击视差页脚
- python - PythonScript 不会从文件夹运行,而是从终端运行
- python - 如何检测列表项的特定值何时更改并通过与相应项的映射将索引捕获到字典中