2016-02-29 16 views
9

Pracuję nad aplikacją, która uwierzytelnia oauth2, która działała, ale niestety już nie działa. O ile wiem (ale nie w 100% pewna) nic się nie zmieniło w kodzie, więc nie wiem, dlaczego to by nie zadziałało.Dlaczego Gmail nie działa w mojej aplikacji na Androida?

Aplikacja tworzy webview i ładuje URL z naszym serwerem, który przekierowuje do Google w celu uwierzytelnienia na ten adres URL (tylko zmiana identyfikatora klienta i mojej domeny):

https://accounts.google.com/o/oauth2/auth?response_type=code&client_id=1234567890-XXXXXXX.apps.googleusercontent.com&redirect_uri=http%3A%2F%2Fexample.com%3A5000%2Fchannel%2Fgmail%2Fcallback&scope=https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fuserinfo.email+https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fgmail.readonly&access_type=offline 

który natychmiast przekierowuje go na adres:

https://accounts.google.com/ServiceLogin?passive=1209600&continue=https://accounts.google.com/o/oauth2/auth?access_type%3Doffline%26scope%3Dhttps://www.googleapis.com/auth/userinfo.email%2Bhttps://www.googleapis.com/auth/gmail.readonly%26response_type%3Dcode%26redirect_uri%3Dhttp://example.com:5000/channel/gmail/callback%26client_id%3D123456789-XXXXX.apps.googleusercontent.com%26hl%3Dnl%26from_login%3D1%26as%3D-2178738b5063e716&ltmpl=popup&oauth=1&sarp=1&scc=1 

Ten sam system jest używany z naszej aplikacji na iOS, która działa jak urok. Więc nie ma nic złego w naszej implementacji serwera. Po przekierowaniu do strony internetowej Google automatycznie powraca do aplikacji bez wyświetlania żadnego ekranu google. używam następujący kod, aby otworzyć webview:

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
    View view = inflater.inflate(R.layout.fragment_browser_webview, container, false); 

    webView = (WebView) view.findViewById(R.id.web_view); 

    webView.getSettings().setJavaScriptEnabled(true); 
    webView.getSettings().setDisplayZoomControls(false); 
    webView.getSettings().setLoadWithOverviewMode(true); 
    webView.getSettings().setUseWideViewPort(true); 
    webView.getSettings().setDomStorageEnabled(true); 

    webView.setWebViewClient(new WebViewClient() { 
     public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) { 
      Log.wtf("ERROR", description + " " + failingUrl); 
     } 

     @Override 
     public boolean shouldOverrideUrlLoading(WebView view, String url) { 
      Log.wtf("WEBVIEW URL", url); 
      if (url.contains(Api.API_ENTER_POINT)) { 
       // We never actually get here 
       getActivity().finish(); 
      } 

      return false; //Allow WebView to load url 
     } 
    }); 
    if (userId != null & userToken != null) { 
     Log.d("Gmail login", String.format(Api.API_GMAIL,userId,userToken)); 
     webView.loadUrl(String.format(Api.API_GMAIL,userId,userToken)); 
    } 
    return view; 
} 

a wyjście logcat jest następujący:

02-29 18:56:39.028 27510-27510/com.example D/Gmail login: http://example.com:5000/api/v1/channel/gmail/on/1/CAAV8cDYVv9wBAKDfKu7zjInpUbSxBjSiouG8iFtP2EGKjb63AOAjirFf9SepSwe62PsNt0pflwZBKs8xvoH2Y7cnOsHTC33ikbwLFgwiqmK7AtHYzo2BTZAmiDGQvCKZBSdjIR5o5zvgqSZAFiGEU10PVTnXw2fRJzukQ0VEVoZC9VrO7el8hjeg2VoVBFhb9ppPCsHYkPKRWgThKJ76VJS4K3m2X7LwZD 
02-29 18:56:39.092 27510-27510/com.example D/cr_Ime: [ImeAdapter.java:358] onViewFocusChanged: gainFocus [true] 
02-29 18:56:39.119 27510-27510/com.example D/cr_Ime: [ImeAdapter.java:140] onCreateInputConnection returns null. 
02-29 18:56:39.162 27510-27510/com.example I/Timeline: Timeline: Activity_idle id: [email protected] time:227199315 
02-29 18:56:39.163 27510-27510/com.example A/WEBVIEW URL: https://accounts.google.com/o/oauth2/auth?response_type=code&client_id=1234567890-XXXXXXXXXX.apps.googleusercontent.com&redirect_uri=http%3A%2F%2Fexample.com%3A5000%2Fchannel%2Fgmail%2Fcallback&scope=https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fuserinfo.email+https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fgmail.readonly&access_type=offline 
02-29 18:56:39.216 27510-27510/com.example A/WEBVIEW URL: https://accounts.google.com/ServiceLogin?passive=1209600&continue=https://accounts.google.com/o/oauth2/auth?access_type%3Doffline%26scope%3Dhttps://www.googleapis.com/auth/userinfo.email%2Bhttps://www.googleapis.com/auth/gmail.readonly%26response_type%3Dcode%26redirect_uri%3Dhttp://example.com:5000/channel/gmail/callback%26client_id%3D1234567890-XXXXXXXXXX.apps.googleusercontent.com%26hl%3Dnl%26from_login%3D1%26as%3D-231b0767e02a8ca9&ltmpl=popup&oauth=1&sarp=1&scc=1 
02-29 18:56:39.283 27510-27510/com.example I/Timeline: Timeline: Activity_idle id: [email protected] time:227199436 
02-29 18:56:39.287 27510-27510/com.example D/cr_Ime: [ImeAdapter.java:358] onViewFocusChanged: gainFocus [false] 
02-29 18:56:39.287 27510-27510/com.example D/cr_Ime: [ImeAdapter.java:326] hideKeyboard 
02-29 18:56:39.288 27510-27510/com.example D/cr_Ime: [InputMethodManagerWrapper.java:56] isActive: false 

Od tego dziennika nie naprawdę daje błąd, jestem pewien co może być nie tak.

Czy ktoś ma pojęcie, co może być złe lub jak mogę to debugować? Wszystkie wskazówki są mile widziane!

+0

Może to pomoże: http://stackoverflow.com/questions/12854468/google-oauth-api-not-working-anymore-404-error – domax

+0

Po prostu dzikie domysły: Możliwe, że zezwoliłeś na dostęp być zapamiętanym, a Google pomyślnie uwierzytelnia się na podstawie konta Google zarejestrowanego na twoim urządzeniu? Spróbuj usunąć konto Google na urządzeniu, wyczyść dane w aplikacji i spróbuj ponownie. – Codebender

+0

Użyj Stetho z Facebooka http://facebook.github.io/stetho/ do monitorowania komunikacji między Twoją aplikacją a serwerem i serwerem google .. –

Odpowiedz

1

Kod prawdopodobnie przestał działać z powodu aktualizacji w niektórych częściach interfejsu API, z których korzystasz; Zgaduję, że może to być aktualizacja z OAuth do OAuth2 lub ewentualnie łatka łatki. Najprostszym fix byłoby dodać korzysta z uprawnień i metadane na swojej AndroidManifest.xml:

<uses-permission android:name="android.permission.INTERNET"/> 
<uses-permission android:name="android.permission.GET_ACCOUNTS"/> 
<uses-permission android:name="android.permission.USE_CREDENTIALS"/> 

<meta-data android:name="com.google.android.gms.version" 
      android:value="@integer/google_play_services_version" /> 

Jeśli nie rozwiąże to, to najprawdopodobniej większy problem pod ręką.

Zgodnie z this post, lepiej jest używać onCreate() do wykonywania jakichkolwiek nie-graficznych inicjalizacji, ponieważ jest on wywoływany przed onCreateView(). Aby móc zalogować się do Google, jak stwierdzono w this post, trzeba najpierw wybrać konto z urządzenia jak tak (umieścić to w swoim Main.java lub MainActivity.java):

public static AccountManager accountManager; 
accountManager = AccountManager.get(this); 
Account[] accounts = accountManager.getAccountsByType("com.google"); 

Następnie, trzeba dostać token z wybranego konta tak:

private void onAccountSelected(final Account account) { 
    accountManager.getAuthToken(account, AUTH_TOKEN_TYPE, null, this, new AccountManagerCallback<Bundle>() { 
     public void run(AccountManagerFuture<Bundle> future) { 
      try { 
       String token = future.getResult().getString(AccountManager.KEY_AUTHTOKEN); 
       useToken(account, token); 
      } catch (OperationCanceledException e) { 
       onAccessDenied(); 
      } catch (Exception e) { 
       handleException(e); 
      } 
     } 
    }, null); 
} 

Następnie, po uwierzytelnienia token konta, będą mogli zalogować się do google, korzystając OAuth2 (Patrz OAuth2 GitHub Source kodu uwierzytelniającego).

Jeśli nadal występują problemy i/lub nie w pełni odpowiedzieć na to pytanie, sprawdź this na temat korzystania z AccountManager OAuth2 i API lub this na temat korzystania z WebView OAuth2 . Ten ostatni prawdopodobnie odnosi się bardziej do twoich potrzeb. Oba dają przykładowe pliki, jak robić to, czego szukasz.

Jeśli nawet po przeczytaniu dwa linki powyżej nadal potrzebujesz pomocy lub masz pytania lub wątpliwości, prosimy zostawić komentarz!

Powiązane problemy