2009-03-22 9 views
35

Sto costruendo un'applicazione Python che deve comunicare con un fornitore di servizi OAuth. SP richiede di specificare un URL di richiamata. Specificare localhost ovviamente non funzionerà. Non riesco a configurare un server pubblico di fronte. Qualche idea oltre a pagare per server/hosting? È possibile?Come si sviluppa OAuth localmente?

risposta

18

due cose:

  1. L'OAuth provider di servizi in questione sta violando le specifiche OAuth se si sta dando un errore se non si specifica un URL di callback. callback_url è spec'd to be an OPTIONAL parameter.

  2. Ma, pedanteria a parte, probabilmente vorrai ricevere una richiamata quando l'utente ha finito, così sai che puoi riscattare il token di richiesta per un token di accesso. Yahoo's FireEagle developer docs hanno molte ottime informazioni su come farlo.

Anche nel secondo caso, l'URL di richiamata in realtà non deve essere visibile da Internet. Il fornitore di servizi OAuth reindirizzerà il browser utilizzato dall'utente per fornire il proprio nome utente/password all'URL di richiamata.

I due modi più comuni per farlo sono:

  1. creare un servizio Web muto dall'interno dell'applicazione che ascolta ad una porta (ad esempio, http://localhost:1234/) per il callback di completamento, o
  2. Pubblicare un protocollo gestore (dovrai verificare con la documentazione del tuo sistema operativo in particolare su come fare una cosa del genere, ma abilita cose come < a href = "skype: 555-1212" > per funzionare).

(Un esempio di flusso che credo che stai descrivendo lives here.)

0

Si potrebbe creare 2 applicazioni? 1 per la distribuzione e l'altro per il test.

In alternativa, è possibile includere anche un parametro oauth_callback quando si richiede un token di richiesta. Alcuni provider reindirizzeranno all'URL specificato da oauth_callback (ad esempio Twitter, Google) ma alcuni ignoreranno questo url di richiamata e reindirizzeranno a quello specificato durante la configurazione (ad es.Yahoo)

4

Questo era con l'OAuth di Facebook: in realtà era in grado di specificare "http://127.0.0.1:8080" come l'URL del sito e l'URL di richiamata. Ci sono voluti diversi minuti prima che le modifiche all'app Facebook si propagassero, ma poi ha funzionato.

+2

Infatti. 'localhost' non funzionerà, ma' 127.0.0.1' lo farà. –

10

Nel caso in cui si utilizza * lo stile del sistema nix, creare un alias come 127.0.0.1 mywebsite.dev in /etc/hosts (è necessario avere la linea che è simile a sopra menzionato nel file, utilizzare http://website.dev/callbackurl/for/app in call back URL e durante i test locale.

+1

Anche Windows ha un file hosts. Su Windows 7 è su 'C: \ Windows \ System32 \ drivers \ etc \ hosts' –

0

Così come ho risolto questo problema (usando l'interfaccia di OAuth di BitBucket) specificando l'URL di callback a localhost (o qualsiasi altra cosa diavolo vuoi), e poi seguendo l'URL di autorizzazione con curl, ma con la sola svolta di restituire l'HTTP Esempio:

curl --user BitbucketUsername:BitbucketPassword -sL -w "%{http_code} %{url_effective}\\n" "AUTH_URL" -o /dev/null 

Inserimento per le tue credenziali e l'URL di autorizzazione (ricorda di sfuggire al punto esclamativo!).

Che cosa si dovrebbe ottenere è qualcosa di simile:

200 http://localhost?dump&oauth_verifier=OATH_VERIFIER&oauth_token=OATH_TOKEN 

E si può raschiare l'oath_verifier da questo.

fare lo stesso in pitone:

import pycurl 
devnull = open('/dev/null', 'w') 
c = pycurl.Curl() 

c.setopt(pycurl.WRITEFUNCTION, devnull.write) 
c.setopt(c.USERPWD, "BBUSERNAME:BBPASSWORD") 
c.setopt(pycurl.URL, authorize_url) 
c.setopt(pycurl.FOLLOWLOCATION, 1) 
c.perform() 

print c.getinfo(pycurl.HTTP_CODE), c.getinfo(pycurl.EFFECTIVE_URL) 

Spero che questo sia utile per qualcuno!

+0

Il caveat con questo (almeno con BitBucket), è che dovrai visitare l'URL per fare clic su accetta almeno inizialmente. E poi penso che ricordi le tue credenziali. –

Problemi correlati