2011-12-15 12 views
28

Estoy construyendo una API REST para un proyecto que estoy trabajando y me gustaría hacer la aplicación principal de la API consumen porque:preguntas sobre el consumo de su propia API con OAuth

  1. que se traducirá en tener un conjunto de código para mantener
  2. si decidimos exponer la API para desarrolladores de 3 ª parte que ya se hará
  3. se abre la posibilidad para que las aplicaciones móviles que consumen
  4. realmente quiero aprender cómo hacerlo

La API se alojará en un subdominio https://api.example.com y la aplicación web principal se alojará en el dominio raíz https://example.com.

Conceptualmente entiendo cómo funciona todo, pero mi pregunta principal es cómo cambiará el flujo de autenticación, si es que lo hace. aplicaciones normalmente de 3 ª parte serían:

  1. obtener un token de solicitud de https://api.example.com/request_token
  2. redirigir al usuario a autenticarse en https://api.authenticate.com/authorize
  3. redirecciona a la aplicación de 3 ª parte
  4. obtener un token de acceso de https://api.example.com/access_token

Como controlo ambos dominios, ¿puedo hacer algo similar a:

  1. obtener un token de solicitud cuando el usuario accede a la pantalla de inicio de sesión en https://www.example.com
  2. El usuario se autentica mediante un formulario en https://www.example.com que llama el mismo código que https://api.example.com/authorize
  3. Si las credenciales son válidas, el token de solicitud se intercambia para el token de acceso
  4. token de acceso
  5. se guarda en la sesión y expira cuando el usuario cierra la sesión como lo haría normalmente

Paso 3 se siente como que está mal ya que habrá Duplica te código, pero ¿no me abriría para ataques XSS es el formulario de inicio de sesión en https://www.example.com envió los datos a https://api.example.com ya que son técnicamente dominios diferentes?

¿Estoy sobrecomplicando esto?

Respuesta

20

Me he encontrado con el mismo problema y lo he resuelto así.

Para aplicaciones de terceros, al usar mi API, tienen que autenticarse a través de OAuth en todas las solicitudes.

Por mis propios clientes de terceros, (móvil, AIRE etc) - que utilizan OAuth, con la diferencia de que permitir que estas envíen nombre de usuario y contraseña directamente en la etapa de autorización (por lo que puede hacer un nativo dialogo de inicio de sesión). Esto se proporciona siempre que su API tenga SSL/HTTPS.

Para mi aplicación web, utilizo la autenticación de cookies para acceder a las API. Es decir, después de haber iniciado sesión, el usuario simplemente puede llamar a API: URL y recuperar JSON/XML. Es bueno también para explorar rápidamente las API (aunque una consola API real como APIGee hace un mejor trabajo allí).

+2

¿Pueden dar más detalles sobre el ítem 3? Cuando el usuario inicia sesión, ¿está guardando un ID de sesión en una cookie y luego usándolo como un token de pseudo acceso para cuando realiza una llamada API, y luego lo busca cuando recibe la solicitud API? Parece que sería una vulnerabilidad de seguridad ... – Steve

+1

En esencia, sí. Pero, ¿cómo es eso una vulnerabilidad? No uso OAuth cuando llamo a las API desde la aplicación web. Si está conectado (como lo determina la validación de la cookie), se puede acceder a las API simplemente llamando a la URL. Sin embargo, me olvidé de mencionar que sirvo las API en la aplicación web en el mismo dominio. –

+0

Supongo que siempre y cuando no confíe únicamente en la identificación de la sesión para identificar al usuario en el servidor, no lo es. Estaba pensando que podría abrirse a [Session Hijacking] (http://en.wikipedia.org/wiki/Session_hijacking), pero es el viernes después de la escuela y estoy cansado. En función de tus respuestas a otras preguntas, definitivamente eres un hombre muy bien informado. ¡Gracias por tu ayuda! – Steve

0

Yo diría que lo estás complicando un poco. Si su código está separado adecuadamente, puede construir fácilmente una capa REST delgada sobre la capa de servicio de su aplicación, mientras que los controladores de su aplicación también serán una capa delgada sobre su capa de servicio.

+2

¿Qué quiere decir con capa de servicio? ¿Es eso los modelos dentro de los controladores que hacen todo el trabajo pesado? Si es así, entonces ese es mi plan, en realidad es el bit de autenticación el que me está dando vueltas. Quiero mover toda la lógica empresarial a un subdominio de API separado porque tendremos que exponerlo para el desarrollo de aplicaciones móviles, y creo * que me ayudará con la escalabilidad en el sentido de que puedo girar hacia arriba o hacia abajo el número de clientes tontos que se conectan a la API y simplemente tienen la API central manejar todo el almacenamiento en caché de datos. Aunque no sé mucho acerca de la escalabilidad ... – Steve