2016-02-29 20 views
9

Ich arbeite an einer App, die eine oauth2-Authentifizierung durchführt, die früher funktioniert hat, aber leider nicht mehr funktioniert. Soweit ich weiß (aber nicht 100% sicher), hat sich am Code nichts geändert, daher weiß ich nicht, warum das nicht mehr funktionieren würde.Warum funktioniert Google Mail oauth nicht in meiner Android App?

Die App erstellt eine Webansicht und lädt eine URL von unserem Server, die es Umleitungen Google auf diese URL zu authentifizieren (nur geändert Client-ID und meine Domain):

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 

die sofort leitet es an:

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 

Das gleiche System wird von unserer iOS-App verwendet, die wie ein Zauber wirkt. Es ist also nichts falsch mit unserer Serverimplementierung. Nachdem die Webansicht zu Google umgeleitet wurde, kehrt sie automatisch zur App zurück, ohne einen Google-Bildschirm anzuzeigen. Ich verwende den folgenden Code, um die Webansicht zu öffnen:

@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; 
} 

und die logcat Ausgabe lautet wie folgt:

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 

Da dieses Protokoll wirklich keinen Fehler geben, ich bin nicht sicher, was könnte falsch sein.

Hat jemand eine Idee, was könnte möglicherweise falsch sein oder wie kann ich dies debuggen? Alle Tipps sind willkommen!

+0

Vielleicht wird dies helfen: http://StackOverflow.com/questions/12854468/google-oauth-api-not-working-anymore-404-error – domax

+0

Nur eine wilde Vermutung: Es könnte sein, weil Sie den Zugriff erlaubt haben Google erinnert sich und Google erfolgreich authentifiziert basierend auf dem Google-Konto auf Ihrem Gerät registriert? Versuchen Sie, das Google-Konto auf Ihrem Gerät zu entfernen, löschen Sie die Daten in Ihrer App und versuchen Sie es erneut. – Codebender

+0

Verwenden Sie Stetho von Facebook http://facebook.github.io/stetho/, um die Kommunikation zwischen Ihrer App mit dem Server und dem Google-Server zu überwachen. –

Antwort

1

Ihr Code funktioniert wahrscheinlich nicht mehr, da in einem Teil der von Ihnen verwendeten APIs ein Update durchgeführt wurde. Ich vermute, es könnte von OAuth auf OAuth2 aktualisiert werden, oder möglicherweise ein einfaches Patch-Update. Die einfachste Lösung wäre es, Anwendungen Berechtigungen und Metadaten zu Ihrem AndroidManifest.xml hinzufügen:

<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" /> 

Wenn das es nicht beheben, gibt es wahrscheinlich ein größeres Problem bei der Hand.

Gemäß this post ist es besser, onCreate() für alle nicht grafischen Initialisierungen zu verwenden, da es vor onCreateView() aufgerufen wird. Um Google anmelden zu können, wie in this post angegeben, müssen Sie zunächst ein Konto aus dem Gerät wie so auszuwählen (fügen Sie dies in Ihrem Main.java oder MainActivity.java):

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

Dann müssen Sie bekommen das Token aus dem ausgewählten Konto wie folgt:

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); 
} 

Dann, sobald Sie das Token und Konto authentifizieren, können Sie sich anmelden to google OAuth2 mit (siehe die OAuth2 GitHub Source für den Authentifizierungscode).

Wenn Sie noch Probleme und/oder ich Ihre Frage Besuche nicht vollständig antwortete this wie OAuth2 zu verwenden, um mit AccountManager und API-Aufrufe oder this, wie OAuth2 zu verwenden, um mit WebView . Letzteres gehört wahrscheinlich eher zu Ihren Bedürfnissen. Beide geben ganze Beispieldateien an, um zu tun, wonach Sie suchen.

Wenn auch nach den beiden Links oben Lesen Sie noch Fragen zur Hilfe oder haben müssen, fühlen sich frei, um einen Kommentar zu hinterlassen!

Verwandte Themen