Wie kann ich den Google App Engine Endpoints API auf nur meine Android-Anwendungen beschränken?

Ich bin ein Android-Entwickler bauen meine erste Google App Engine (Java) Back-End für meine Apps. Ich möchte nicht, dass jemand anderes auf diese API als meine App zugreifen kann. (Ich beabsichtige, App-Engine für die Überprüfung von InApp-Einkäufen in meiner Android-App zu verwenden). Meine Daten sind für Benutzer nicht relevant, ich möchte nicht, dass Benutzer auf meine API zugreifen können, auch wenn sie mit ihren Google-Konten angemeldet sind (auf Web- oder Android-Geräten).

Ich folgte den erwähnten Schritten – "Angabe von autorisierten Clients im API-Backend" ( https://developers.google.com/appengine/docs/java/endpoints/auth ) wie das Erstellen von Client-IDs und das Hinzufügen von @Api (clientIds und Publikum) außer "Benutzer hinzufügen" – da ich keine Benutzerauthentifizierung benötige.

Dann habe ich App-Engine implementiert und ich bin immer noch in der Lage, die API über API Explorer ( https://your_app_id.appspot.com/_ah/api/explorer ) zuzugreifen (ich habe keine API_EXPLORER Client ID hinzugefügt)

Ich habe mit der APK getestet, die mit dem Endpunkt libs vor dem Hinzufügen von Client-IDs erstellt wurde und trotzdem auf die API zugreifen kann.

  • Ist das Hinzufügen eines "User-Parameters" zu allen Endpunkt-APIs ein Muss? Um meinen Zweck zu erreichen (beschränke API auf nur meine Android Apps).

  • Kann ich null als userAccount Namen von Android-Client und ignorieren Benutzer Parameter Wert auf Server (da ist es null)? Wird dies sichergestellt, dass die API nur von meinen Android-Apps aus zugänglich ist (da die Client-ID für meinen Paketnamen und SHA1 der APK generiert wird)?

  • Soll ich so etwas wie ein Dienstkonto verwenden?

Die Dokumentation sagt für Android, sowohl Android-und Web-Client-IDs müssen hinzugefügt werden und Publikum muss die gleiche wie Web-Client-ID sein. Erlaubt dieser Zugang zu jedem anderen Webclient? Kann ich das Erwarten von Web-Client-ID überspringen und noch meinen Zweck erreichen?

Schätzen Sie Ihre Zeit und Hilfe.

…… Aktualisierung mit meiner weiteren Untersuchung …

Ich habe folgendes gemacht:

  • Benutzer-Parameter zu APIs auf Backend hinzugefügt – aber nicht auf Nullwert überprüft. API kann immer noch ohne Zugriff auf alle Anmeldeinformationen (von Android Debug APK und API Explorer) zugegriffen werden

  • Dann habe ich versucht

    MCredential = GoogleAccountCredential.usingAudience (dies, "server: client_id:" + WEB_CLIENT_ID); MCredential.setSelectedAccountName (null);

Und bestanden diese Berechtigung an API Builder (wie in einigen anderen Beiträgen vorgeschlagen) verursacht FATAL EXCEPTION. Also, wir können nicht null Kontoname übergeben.

  • Ich könnte die API mit API Explorer ohne OAuth anrufen. Aber als ich OAuth ermöglichte, gab es Fehler, dass diese Client-ID nicht erlaubt ist! (Ich habe noch keine com.google.api.server.spi.Constant.API_EXPLORER_CLIENT_ID in client_ids {} hinzugefügt)

  • Dann habe ich Code hinzugefügt, um OAuthRequestException auf das Backend zu werfen, wenn der Benutzer null ist. Dies führte dazu, dass API-Explorer Fehler ohne OAuth bekam. Es funktioniert mit OAuth aktiviert nach dem Hinzufügen von API_EXPLORER_CLIENT_ID zu client_ids)

  • Code hinzugefügt, um den gültigen Benutzerkontonamen (E-Mail) von meiner Android App zu übergeben. Dann bin ich in der Lage, API nur mit meinem Release APK zuzugreifen. Auch das Debug APK bekommt Ausnahmen! – was ist das, was ich erwartet habe .. Also, ich gehe davon aus, dass keine anderen Android-Apps in der Lage sind, auf diese API zuzugreifen.

Also, nicht für null Benutzer auf Back-End-API ist eine schlechte Idee (wie in anderen Beiträgen vorgeschlagen). Es ist so gut wie nicht erwähnen alle client_ids und nicht mit User param.

Nur die Frage, die ich in diesem Moment habe, ist: Wenn jemand die WEB_CLIENT_ID von der APK herausfinden kann, werden sie in der Lage sein, es zu benutzen, um einen Web-Client zu erstellen, um auf meine API zuzugreifen (ich habe den Client nicht geheim irgendwo im Code erwähnt. Also denke ich das ist nicht möglich).


Ich habe Google-Gruppen und Stackoverflow gesucht, aber trotzdem ist es nicht klar.

  • (Authentifizierung meiner "App" an Google Cloud Endpunkte nicht ein "Benutzer") Authentifizierung meiner "App" an Google Cloud Endpunkte nicht ein "Benutzer"

  • (Wie schütze ich meine API, die mit Google Cloud Endpoints erstellt wurde?) Wie schütze ich meine API, die mit Google Cloud Endpunkten erstellt wurde?

  • (Zugriff auf Google Cloud-Endpunkte auf Android-App beschränken) Zugriff auf Google Cloud-Endpunkte auf Android-App beschränken

  • Funktion User.getUserId () in Cloud-Endpunkt api gibt null für ein Benutzerobjekt zurück, das nicht null ist
  • Google Cloud Endpunkte und Benutzerauthentifizierung
  • Android + App-Engine: user.getUserID () ist im Endpunkt null
  • Warum hat Blobstore-Upload-Code umgeleitet URL
  • Google Volley Lib mit authentifizierten Appengine Endpunkten?
  • Wie deaktiviere ich GZipContent in Cloud Endpoints Builder in Android
  • Google App Engine Cloud Endpunkte userId ist null
  • GoogleAuthException: Unbekannt bei der Authentifizierung mit Cloud Endpunkten
  • 5 Solutions collect form web for “Wie kann ich den Google App Engine Endpoints API auf nur meine Android-Anwendungen beschränken?”

    Ich hatte ein ähnliches Problem, nicht zwischen Android und App Engine, sondern zwischen einem separaten Server und App Engine. Die Art, wie ich es behandelt habe, war, ein Signatur-Hash-Feld als Parameter für jeden API-Aufruf hinzuzufügen. Wenn die Anfrage eine falsche Unterschrift hatte, würde es verweigert werden.

    Nehmen wir zum Beispiel an, dass Ihr API-Endpunkt example.com/api/do_thing?param1=foo . Ich würde die ganze URL, zusammen mit einem geheimen Schlüssel, hacken und dann das Ergebnis des Hashs an die Anfrage anfügen: example.com/api/do_thing?param1=foo&hash=[some long hex value] .

    Dann, auf der Server-Seite, würde ich zuerst entfernen Sie den Hash aus der URL-Anfrage, dann führen Sie den Hash auf alles, was noch übrig war. Schließlich prüft man, ob der berechnete Hash mit dem übereinstimmt, der mit der Anfrage gesendet wurde und wenn nicht, können Sie die Anforderung verweigern.

    Es ist aber sehr wichtig, dass dein geheimer Schlüssel geheim bleibt. Du musst mit diesem auf Android vorsichtig sein, weil jemand versuchen könnte, deine APK zu dekompilieren.

    Angesichts des gleichen Problems als du! Authentifizieren Android Endpunkt ohne Google User Account ist einfach unmöglich!

    Also hier ist mein Weg, um dieses Problem zu lösen, ohne jede Benutzer-Interaktion (vielleicht nicht das richtige, aber das funktioniert, und Sie haben eine starke Authentifizierung (SHA1 + Google Account)):

    HIER IST MEIN ANDROID CODE

    Get and Build Gültige Anmeldeinformationen

      //Get all accounts from my Android Phone String validGoogleAccount = null; Pattern emailPattern = Patterns.EMAIL_ADDRESS; // API level 8+ Account[] accounts = AccountManager.get(context).getAccounts(); for (Account account : accounts) { if (emailPattern.matcher(account.name).matches()) { //Just store mail if countain gmail.com if (account.name.toString().contains("gmail.com")&&account.type.toString().contains("com.google")){ validGoogleAccount=account.name.toString(); } } } //Build Credential with valid google account GoogleAccountCredential credential = GoogleAccountCredential.usingAudience(this,"server:client_id:301991144702-5qkqclsogd0b4fnkhrja7hppshrvp4kh.apps.googleusercontent.com"); credential.setSelectedAccountName(validGoogleAccount); 

    Verwenden Sie diese Berechtigung für sichere Anrufe

     Campagneendpoint.Builder endpointBuilder = new Campagneendpoint.Builder(AndroidHttp.newCompatibleTransport(), new JacksonFactory(), credential); 

    HIER IST MEIN API BACKEND CODE: API Annotation

     @Api( scopes=CONSTANTES.EMAIL_SCOPE, clientIds = {CONSTANTES.ANDROID_CLIENT_ID, CONSTANTES.WEB_CLIENT_ID, com.google.api.server.spi.Constant.API_EXPLORER_CLIENT_ID}, audiences = {CONSTANTES.ANDROID_AUDIENCE}, name = "campagneendpoint", version = "v1" ) 

    Methodencode:

     public Collection<Campagne> getCampagnes(@Named("NumPortable")String NumPortable, User user) throws UnauthorizedException { if (user == null) throw new UnauthorizedException("User is Not Valid"); return CampagneCRUD.getInstance().findCampagne(NumPortable); } 

    Für den Moment funktioniert es nur auf Android (ich weiß nicht, wie wir auf IOS machen werden ..) ..

    Hoffe, es wird dir helfen!

    Google bietet Möglichkeiten, dies für Android , web und iOS zu tun. Die Schritte beinhalten:

    1. Angeben einer Client-ID für Apps, die Sie zulassen möchten, um Anfragen an Ihre API zu senden
    2. Hinzufügen eines User-Parameters zu allen exponierten Methoden, die durch eine Autorisierung geschützt werden sollen.
    3. Erstellung der Clientbibliothek für alle Android-Clients
    4. Wiederherstellung Ihrer Backend-API.
    5. Aktualisieren der regenerierten JAR-Datei auf Ihr Android-Projekt für Ihren Android-Client.

    Diese Schritte sind in klarer Einzelheiten auf Google mit Auth mit Endpunkten und auch auf diesem Blog angelegt

    Angesichts des gleichen Problems, hier sind das Ergebnis meiner Forschung:

    • Android-Cliend-ID mit SHA1-Fingerabdruck in der Google-Konsole hinzugefügt
    • Verwenden Sie es in der API-Annotation

    ABER :

    • Wenn ich nicht hinzufügen Benutzer-Parameter zu Methoden: die Überprüfung über Android App Client-ID funktioniert nicht

    • Wenn ich den USER-Parameter hinzufüge, aber nicht den Benutzer bitten, sein Google-Konto zu wählen, um das Anmeldeinformationen zu erstellen … auch das geht nicht …

    Fazit: Es scheint obligatorisch zu sein, ein Benutzerkonto für die Prüfung über die App-Client-ID, die ausgeführt werden soll, zu verbinden … Ich verstehe wirklich nicht, warum, weil kein Link zwischen den 2 Prozessen besteht

    Besuchen Sie diese Seite

    Wählen Sie Ihr Projekt, gehen Sie zu den Anmeldeinformationen

    Erstellen Sie einen neuen API-Schlüssel

    Erstellen Sie einen neuen Android-Schlüssel

    Klicken Sie auf "Bearbeiten zulässige Android-Anwendungen" und geben Sie Ihre SHA1-Taste; Ihr Name des Android-Pakets

    Lassen Sie mich wissen, ob das die Probleme löst.

    Das Android ist ein Google Android Fan-Website, Alles ├╝ber Android Phones, Android Wear, Android Dev und Android Spiele Apps und so weiter.