2013-03-13 17 views
12

Ich baue eine iOS-App, bei der der Nutzer Google-APIs über Oauth2 mithilfe des serverseitigen Webflows autorisieren muss. Ich öffne gerade ein UIWebView, um den oauth2 Fluss zu beginnen.Verwenden von Google Oauth2-Webflow von iOS + Bonjour (Yikes!)

Das funktioniert gut im Simulator, weil ich den Umleitungs-URI auf http://localhost setze und einen Server auf meinem lokalen Rechner laufen lasse.

Allerdings möchte ich auf dem Gerät testen, während immer noch eine Verbindung zu einem Server auf meinem Desktop läuft. Um dies zu tun, habe ich die App bekommen, um meine Desktop-Adresse (eine lokale Subnetz-IP oder bonjour Adresse wie http://foo.local.) zu finden, um eine Verbindung zum Server herzustellen. Der Google Oauth2-Flow besagt jedoch, dass lokale URIs nicht als Weiterleitungs-URL verwendet werden können.

Gibt es einen Weg um dies zu umgehen? Ich möchte, wenn möglich, nicht mit meinen lokalen Netzwerkeinstellungen oder Proxy-Anfragen von meinem IOS-Gerät zu tun haben. Ich würde auch gerne den bonjour-Service nutzen können, um den Server zu entdecken, da wir ein Team von Entwicklern haben und unsere App Ihnen die Auswahl des Servers im lokalen Netzwerk ermöglicht, mit dem Sie sich verbinden möchten.

Optionen?

Antwort

0

Ich endete damit, indem ich den folgenden Ansatz nahm.

In meinem UIWebView habe ich alle Ladeanforderungen abgefangen und die URLs geändert. Im Grunde habe ich redirect_uri auf etwas public gesetzt (das ist auch auf der api-Konsole registriert), aber wenn das UIWebView versucht, diesen Redirect-URI zu laden (nach mehreren Redirects), schreibe ich diese URL neu, um stattdessen auf einen Callback auf meinem Mac zu zeigen das lokale Netzwerk.

Offensichtlich muss dies beim Parsen des Tokens auf der Serverseite berücksichtigt werden.

2

Aktualisiert 19/03/2013

Wenn Server ist ein mittlerer Mann haben muss, dann recon ich der einfachste Weg, einen Domain-Namen zu greifen ist und machen die Server die Öffentlichkeit gehen. www.godaddy.com oder jeder Domain-Name-Anbieter erhält einen Domain-Namen für ca. $ 15 pro Jahr (wäre niedriger, wenn es Rabatt gibt).

Danach suchen Sie dann einfach, wie Sie ein dynamisches DNS erhalten und richten Sie die redirect_uri als den Domain-Namen ein, der gewählt wurde.

Sonst habe ich nicht gesehen, die Rolle des Servers spielt hier, wenn nur für den oauth Zweck. Als zweite Methode, die unten aufgeführt ist, kann ein Gerät direkt mit Google Server kommunizieren, selbst hinter einer schwer zu schützenden Firewall. (Token wird übergeben werden die Titelleiste werfen).

Also könnte hier ein bisschen cliirification brauchen.

Würde der Localhost-Server wie ein Hub agieren, um Dateien von Google Drive einzulösen und dann an iOS-Geräte weiterzuleiten? Oder welche Art von Netzwerkarchitektur möchte man hier erreichen?

==

Aktualisiert 18/03/2013

nach dem offiziellen Dokument https://developers.google.com/accounts/docs/OAuth2InstalledApp#choosingredirecturi

Es gibt zwei Möglichkeiten von oauth. Verwenden von localhost als Redirect ist nur eine Möglichkeit.

anderen ist diese Zeichenfolge zu verwenden

urn:ietf:wg:oauth:2.0:oob 

die Anforderung zu ersetzen, wo es lokale Host haben.

Zum Beispiel kann eine vorherige Anfrage mit localhost von (Anmerkung: die Differenz ist auf der Mittellinie beginnend mit ‚redirect_uri =‘)

https://accounts.google.com/o/oauth2/auth?scope=https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fuserinfo.email+https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fuserinfo.profile& 
redirect_uri=http://localhost:9004& 
response_type=code&client_id=812741506391-h38jh0j4fv0ce1krdkiq0hfvt6n5amrf.apps.googleusercontent.com 

kann nun

https://accounts.google.com/o/oauth2/auth?scope=https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fuserinfo.email+https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fuserinfo.profile& 
redirect_uri=urn:ietf:wg:oauth:2.0:oob& 
response_type=code&client_id=812741506391-h38jh0j4fv0ce1krdkiq0hfvt6n5amrf.apps.googleusercontent.com 

so geändert werden Der Zugriff auf die URL des vorherigen im Simulator sollte dem Zugriff auf den letzten im realen Gerät entsprechen.

Halo

+0

Google lässt Sie nicht öffentliche URLs als Weiterleitungs-URIs in der AIPonsole eingeben. – aloo

+1

Bearbeitete meine Antwort, versuchen Sie es einmal: D –

+0

immer noch nicht sicher, ob das funktioniert - welche URL setzen Sie als Redirect_uri? – aloo

0

Können Sie diesen Ansatz versuchen? Fügen Sie den folgend auf Ihre /etc/hosts Datei in Ihrem Mac OSX -

192.168.33.100 trialapp trialapp.com #put your local IP address instead of 192.168.33.100 

Goto Google API console für die neuen Client-ID einrichten und die Umleitungs-URL ändern, um http://trialapp.com/

  • "Anwendungsart: Web Application".
  • Via "Ihre Website oder den Hostnamen (weitere Optionen)":

Was Wir machen Ihre lokale Subnetz-IP-Adresse auf einen Alias-Domain-Namen. Also sollte Google nicht mehr denken, dass dies eine lokale Adresse ist. Sehen Sie, ob das funktioniert?

+0

und was verwende ich als Redirect-URI auf dem Telefon selbst? – aloo

+0

in dem Telefon, das Sie 'http: // trialapp.com /' verwenden, da diese URL an Ihre lokale Subnetzadresse weitergeleitet werden sollte –

+0

Wie würde Trialapp zu meinem Mac geroutet werden? Mein Telefon wird nur trialapp.com normal auflösen, es benutzt nicht meine Macs-Host-Datei ... – aloo