2013-03-02 2 views
0

OAuth 흐름을 Android 앱을 통한 실시간 연결에 적용하려고합니다. 인증 및 동의 부분에 대해서는 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; 
          } 
    

    내가 3-5 단계가 완료 될 때까지 MyActivity 대기를하게 붙어 오전 :

아래는 코드입니다. 이러한 흐름을 구현할 대안을 제안하십시오.

답변

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(); 
      } 
     } 
    }); 
관련 문제