2017-01-10 4 views
1

Hallo ich den Google OAuth 2 expliziten Fluss habe arbeitet nach:Google OAuth 2 impliziter Fluss auf iOS, Aktualisierungs-Token manuell

https://developers.google.com/identity/protocols/OAuth2WebServer

ich auch die impliziten Strömung habe auf iOS mit GIDSignIn arbeiten, speziell I Holen Sie sich den GIDSignInDelegate::sign(_ signIn: GIDSignIn!, didSignInFor user: GIDGoogleUser!, withError error: Error!) Rückruf und haben Zugriff auf user.authentication.accessToken und user.authentication.refreshToken.

Ich versuche, diese refreshToken zurück zu unserem privaten App-Server, so dass es Anfragen im Namen des Benutzers (vor allem, weil es einfacher ist, nur mit dem SDK anmelden, als die Front-End-Entwickler mit rohen Umgang machen URL-Anfragen).

Allerdings, wenn ich versuche, die Aktualisierungs-Token zu verwenden, um einen neuen Zugriffstoken auf dem Back-End zu bekommen:

curl --request POST \ 
    --url https://www.googleapis.com/oauth2/v4/token \ 
    --header 'cache-control: no-cache' \ 
    --header 'content-type: application/x-www-form-urlencoded' \ 
    --data 'client_id={client_id}&client_secret={client_secret}&refresh_token={refresh_token}&grant_type=refresh_token' 

Es gibt:

{ "error": "invalid_grant", "error_description": "Bad Request" }

ich glaube, das Problem ist, dass Mein Server hat eine Client-ID und einen geheimen Schlüssel, aber iOS hat nur eine Client-ID. Ohne ein Geheimnis (manchmal Schlüssel genannt), das der iOS-Client-ID entspricht, gibt es keine Möglichkeit für mich, das Token am Backend zu aktualisieren. Ich hatte die Hoffnung, dass Google erkennen würde, dass sowohl die Server-Client-ID als auch die iOS-Client-ID in derselben App registriert waren und der Server das Token mit seinen Anmeldeinformationen aktualisieren konnte, aber das funktioniert nicht.

Ich habe betrachtet sowohl die "API-Schlüssel" und "OAuth 2.0-Client-IDs" Abschnitte auf:

https://console.developers.google.com/apis/credentials

Aber bin ratlos.

Kennt jemand einen curl-Befehl zum Aktualisieren eines Tokens, das über das iOS SDK erworben wurde?

Oder ist das einfach nicht möglich?

Danke!

Antwort

0

Für alle, die dies lesen, habe ich es funktioniert:

Aus einer Laune heraus habe ich versucht, ohne den Aktualisierungs-Token-Endpunkt aufrufen client_secret vorbei (wie es nicht ein, wenn implizite Strömung auf mobilen verwenden). Hier ist die Wellung:

curl --request POST \ 
    --url https://www.googleapis.com/oauth2/v4/token \ 
    --header 'content-type: application/x-www-form-urlencoded' \ 
    --data 'client_id={client_id}&refresh_token={refresh_token}&grant_type=refresh_token' 

Dies scheint nicht dokumentiert zu sein. Das nächste Beispiel, das ich gefunden habe, ist https://developers.google.com/identity/protocols/OAuth2InstalledApp#refresh, aber es zeigt client_secret=your_client_secret& und erwähnt nie, dass bei implizitem Flow, Front-End-Web und mobile Apps normalerweise kein Client-Secret verwendet wird.

Bitte nicht upvote meine Antwort, da ich nichts getan habe. OAuth ist im Allgemeinen nicht sehr gut dokumentiert oder enthält Code-Snippets, die sich auf Plattform-SDKs ohne die zugrunde liegenden URL-Anforderungen oder Curl-Beispiele beziehen. SDKs sind oft undurchsichtig/closed-source, müssen also auf tcpdump oder packet sniffing herunterfallen, um zu sehen, was passiert. Ich habe die Due Diligence nicht gemacht, ich hatte nur Glück.

Ich habe Feedback an Google gesendet, aber wenn dieses Problem Sie betrifft, können Sie in Google Mail auf das Zahnrad klicken und "Feedback senden", um die Dokumentation hoffentlich schneller aktualisieren zu lassen.

0

entnehmen Sie bitte diesen Link: https://developers.google.com/identity/sign-in/ios/offline-access

Vom Referenz haben Sie 2steps unten zu tun, um Ihren Server in der Lage, lassen Sie Ihre Zugriffstoken

  1. Stellen Sie sicher, dass Server und iOS-App verwenden aktualisieren Anmeldeinformationen des gleichen Projekts, 1-Browser-Taste und 1 iOS Schlüssel
  2. diese Zeile hinzufügen: [GIDSignIn sharedInstance].serverClientID = your_server_client_id
Verwandte Themen