【发布时间】:2014-11-08 00:45:11
【问题描述】:
在 Android 中的 AccountManager 中实现自定义帐户类型时,我在登录流程中遇到以下问题:
应通过 OAuth 提供程序进行登录。因此,我创建了一个 SignInActivity,它启动了一个 WebView 并启动了一个 OAuth 流程。这工作正常,当接收到my-custom-scheme://callback 的回调时,WebView 检测到它,接收code 查询字符串参数并完成流程。使用WebView 的缺点是,即使用户在浏览器中可能已经有一个活动会话,但该会话并没有在WebView 中使用,因此用户必须在WebView 中再次登录。
为了解决这个问题,我尝试在AndroidManifest.xml 中改用intent-filter,如下所示:
<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="my-custom-scheme" android:path="callback"/>
</intent-filter>
我没有在SignInActivity 中打开WebView,而是启动浏览器意图并等待浏览器点击my-custom-scheme://callback。
Intent browserIntent = new Intent(Intent.ACTION_VIEW, "http://oauth2provider/authorize");
startActivity(browserIntent);
finish();
在我的SignInActivity 中,我有以下代码来处理回调:
if (intent != null && intent.getData() != null && getString("my-custom-scheme").equals(intent.getData().getScheme())) {
String code = getIntent().getData().getQueryParameter("code");
// complete oauth flow
}
这行得通。但是,解决问题(终于!):
- 如果用户未登录,浏览器意图将显示 oauth 提供程序的登录页面。用户登录后,Chrome 将重定向到 my-custom-scheme://callback,
SignInActivity将启动以处理该意图。由于此活动是不可见的,因此浏览器将在登录页面上保持打开状态,并且对用户而言,它看起来就像什么都没发生。浏览器永远不会关闭。 - 如果用户已经登录,oauth 提供程序将直接重定向到 my-custom-scheme://callback。在这种情况下,浏览器 标签 会自动关闭,但浏览器本身仍保持打开状态(没有可见的标签)。
所以我的问题是:在重定向到 my-custom-scheme://callback 后,无论如何让浏览器表现不同吗?理想情况下,我希望它在重定向到回调后简单地关闭,并返回到活动堆栈中的上一个活动(即从一开始就启动 SignInActivity 的活动)。
【问题讨论】:
标签: android google-chrome android-intent oauth-2.0