我正试图通过一个安卓应用程序实现实时连接的OAuth流。对于身份验证和同意部分,我使用WebView将用户重定向到相应的页面。我想要实现的流程是-
MyActivity。onCreate()中,启动auth url并等待。MyActivity并使用auth代码执行操作。下面是代码片段:
public class MyActivity extends Activity {
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState)
WebView myWebView = (WebView) findViewById(R.id.webview);
AuthFlowWebView authView = new AuthFlowWebView(); //AuthFlowWebView extends WebViewClient
myWebView.getSettings().setJavaScriptEnabled(true);
myWebView.setWebViewClient(authView);
myWebView.loadUrl("https://login.live.com/oauth20_authorize.srf?client_id=<CLIENT_ID>&scope=wl.signin%20wl.offline_access&response_type=code&redirect_uri=https%3A%2F%2Flogin.live.com%2Foauth20_desktop.srf&display=touch");
Log.i("", "Here already before the auth process is complete");
}
}
//Here is the Overriden onPageFinished method used to parse the auth code in AuthFlowWebView class:
@Override
public void onPageFinished(WebView view, String url) {
super.onPageFinished(view, url);
Thread.dumpStack();
if (url.contains("oauth20_desktop.srf?code=")) {
authSuccess = true;
Uri uri = Uri.parse(url);
authCode = uri.getQueryParameter("code");
Log.i("", "CODE : " + authCode);
authProcessComplete = true;
} 我一直在让MyActivity等待,直到步骤3-5完成为止。请提出实现这一流程的备选方案。
发布于 2013-03-04 16:44:01
更新了我的WebViewClient实现,如下所示,这解决了问题。希望有人能找到有用的东西。
myWebView.setWebViewClient(new WebViewClient() {
boolean authComplete = false;
Intent resultIntent = new Intent();
@Override public void onPageStarted(WebView view, String url, Bitmap favicon){
super.onPageStarted(view, url, favicon);
pDialog = ProgressDialog.show(view.getContext(), "",
"Connecting to " + provider + " server", false);
}
@Override
public void onPageFinished(WebView view, String url) {
super.onPageFinished(view, url);
pDialog.dismiss();
if (url.contains("?code=") && authComplete != true) {
Uri uri = Uri.parse(url);
authCode = uri.getQueryParameter("code");
Log.i("", "CODE : " + authCode);
authComplete = true;
resultIntent.putExtra("code", authCode);
WebActivity.this
.setResult(Activity.RESULT_OK, resultIntent);
resultIntent.putExtra("status", WebActivity.Status.SUCCESS.toString());
setResult(Activity.RESULT_CANCELED, resultIntent);
finish();
}else if(url.contains("error=access_denied")){
Log.i("", "ACCESS_DENIED_HERE");
resultIntent.putExtra("code", authCode);
resultIntent.putExtra("status", WebActivity.Status.ACCESS_DENIED.toString());
authComplete = true;
setResult(Activity.RESULT_CANCELED, resultIntent);
finish();
}
}
});https://stackoverflow.com/questions/15177042
复制相似问题