2009-03-22 13 views
35

Estoy creando una aplicación Python que necesita comunicarse con un proveedor de servicios OAuth. El SP requiere que especifique una URL de devolución de llamada. Especificar localhost obviamente no funcionará. No puedo configurar un servidor público. ¿Alguna idea además de pagar por servidor/hosting? ¿Esto es posible?¿Cómo me desarrollo contra OAuth localmente?

Respuesta

18

dos cosas: Proveedor de servicios

  1. El OAuth en cuestión infringe la especificación OAuth si le está dando un error si no se especifica una URL de devolución de llamada. callback_url es spec'd to be an OPTIONAL parameter.

  2. Pero, aparte de la pedantería, es probable que desee obtener una devolución de llamada cuando el usuario haya terminado para que sepa que puede canjear el token de solicitud de un token de acceso. Yahoo's FireEagle developer docs tienen mucha información excelente sobre cómo hacer esto.

Incluso en el segundo caso, la URL de devolución de llamada en realidad no tiene que ser visible desde Internet en absoluto. El proveedor de servicios de OAuth redirigirá el navegador que usa el usuario para proporcionar su nombre de usuario/contraseña a la URL de devolución de llamada.

Las dos formas más comunes de hacer esto son:

  1. Crear un servicio web muda desde su aplicación que escucha en un puerto (por ejemplo, http://localhost:1234/) para la devolución de llamada de finalización, o
  2. Registrar un protocolo manejador (deberá verificar con la documentación de su sistema operativo específicamente sobre cómo hacer tal cosa, pero permite cosas como < a href = "skype: 555-1212" > para trabajar).

(Un ejemplo del flujo que yo creo que está describiendo lives here.)

0

Se puede crear 2 aplicaciones? 1 para el despliegue y el otro para la prueba.

Alternativamente, también puede incluir un parámetro oauth_callback cuando solicita un token de solicitud. Algunos proveedores redirigirán a la URL especificada por oauth_callback (por ejemplo, Twitter, Google), pero algunos ignorarán esta url de devolución de llamada y redirigirán a la especificada durante la configuración (p. Ej.Yahoo)

4

Esto fue con Facebook OAuth - De hecho, fue capaz de especificar 'http://127.0.0.1:8080' como la URL del sitio y la URL de devolución de llamada. Pasaron varios minutos antes de que los cambios en la aplicación de Facebook se propagaran, pero luego funcionó.

+2

De hecho. 'localhost' no funcionará, pero' 127.0.0.1' lo hará. –

10

En caso de que utilice * Sistema estilo nix, crear un alias como 127.0.0.1 mywebsite.dev en /etc/hosts (es necesario tener la línea que es similar a la mencionada en el archivo, utilice http://website.dev/callbackurl/for/app de devolución de llamada URL y durante la prueba local.

+1

Windows también tiene un archivo de hosts. En Windows 7 está en 'C: \ Windows \ System32 \ drivers \ etc \ hosts' –

0

Entonces, cómo resolví este problema (usando la interfaz OAuth de BitBucket) fue especificando la URL de devolución de llamada a localhost (o lo que realmente quieras), y luego siguiendo la URL de autorización con curl, pero con el giro de solo devolver el HTTP Encabezado Ejemplo:

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

Inserción para sus credenciales y la url de autorización (¡recuerde escapar del signo de exclamación!).

Lo que debe conseguir es algo como esto:

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

Y se puede raspar la oath_verifier de esta.

Hacer lo mismo en Python:

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) 

Espero que esto sea útil para alguien!

+0

La advertencia con esto (al menos con BitBucket), es que tendrá que visitar la URL para hacer clic en aceptar al menos inicialmente. Y luego creo que recuerda tus credenciales. –

Cuestiones relacionadas