2013-03-02 105 views
0

我試圖通過Android應用程序實現實時連接的OAuth流。對於身份驗證和同意部分,我使用WebView將用戶重定向到相應的頁面。我試圖實現的流程是 -使用WebView實現Android OAuth

  1. 啓動MyActivity
  2. onCreate(),啓動auth url並等待。
  3. 用戶使用帳戶登錄並被重定向到同意頁面。
  4. 用戶同意訪問權限。
  5. 解析驗證碼。
  6. 返回到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完成。請建議替代方案來實施這樣的流程。

回答

2

更新了我的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(); 
      } 
     } 
    });