我正在开发一个使用 OAuth 进行身份验证的应用程序,但我在处理 OAuth 回调时遇到了一点问题。
认证
我的应用程序有一个webview作为登录屏幕,我得到一个 url 来在我的 webview中加载身份验证表单。假设网址是:
https://myoauthhost.com/oauth/auth?response_type=code&client_id=XXXXXXX&redirect_uri=YYYYYYYY&scope=ZZZZZZZZZZ
在身份验证活动(AuthActivity.java)中,我有以下内容:
String authURL = https://myoauthhost.com/oauth/auth?response_type=code&client_id=XXXXXXX&redirect_uri=YYYYYYYY&scope=ZZZZZZZZZZ
myWebView.loadUrl(authURL);
在 manifest.xml 中,我有以下 oauth 回调处理:
<activity
android:name=".AuthActivity"
android:label="@string/app_name"
android:screenOrientation="portrait" >
<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="authprovider"
android:scheme="auth" />
</intent-filter>
</activity>
问题
此 url 在 webview 中使用时(使用 loadURL() 方法)重定向到另一个包含REAL OAUTH WEB FROM的 url (应该在 webview 中加载)。问题是这种重定向会自动启动 Android 中的意图选择:由于 URL 应该由 Web 浏览器处理,Android 允许您选择手机上可用的 Web 浏览器之一来打开 URL。
由于这不是我想要的,我必须包含以下代码,以便在 webview 中处理重定向但不启动 web 浏览器(或其他):
myWebView.setWebViewClient(new WebViewClient());
因此,使用此代码,重定向是“在 webview 内”处理的,并且我显示了登录屏幕。
然后我可以输入凭据(例如:通过 Twitter 的 oauth),但是当身份验证完成时,会收到回调,但是应该处理回调的活动(配置为在清单中接收回调的 AuthActivity)没有启动。相反,我让 webview 显示一条消息,指出无法找到 url 回调(在我们的例子中: authprovider://auth/XXX?xxx=yyy 在清单中配置)。
原因可能是以下代码:
myWebView.setWebViewClient(new WebViewClient());
前面介绍过,告诉Android webview 处理一切。所以现在,由于回调 url 不是 web url,它处理起来很麻烦,甚至无法启动可以处理它的意图。
问题
我怎么解决这个问题 ?我应该能够让活动处理回调,但不能让 webview 尝试加载它。
任何帮助,将不胜感激
提前致谢