api - implementar - oauth2 token
Preguntas sobre el consumo de su propia API con OAuth (2)
Estoy construyendo una API RESTful para un proyecto en el que estoy trabajando y me gustaría que la aplicación principal consuma la API porque:
- Conseguirá tener un conjunto de código para mantener
- Si decidimos exponer la API para terceros desarrolladores, ya estará hecho
- Abre la posibilidad de hacer aplicaciones móviles que lo consuman
- 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. Por lo general, aplicaciones de terceros:
- Obtenga un token de solicitud de
https://api.example.com/request_token
- Redirigir al usuario para que se autentique en
https://api.authenticate.com/authorize
- Obtener redirigido a la aplicación de terceros
- Obtenga un token de acceso de
https://api.example.com/access_token
Como controlo ambos dominios, ¿puedo hacer algo similar a:
- Obtenga un token de solicitud cuando el usuario llegue a la pantalla de inicio de sesión en
https://www.example.com
- El usuario se autentica utilizando un formulario en
https://www.example.com
que llama al mismo código quehttps://api.example.com/authorize
- Si las credenciales son válidas, el token de solicitud se intercambia por el token de acceso
- El token de acceso se guarda en la sesión y caduca cuando el usuario cierra sesión como lo haría normalmente
El paso 3 parece estar mal, ya que habrá un código duplicado, pero no me abriría para los ataques XSS. El formulario de inicio de sesión en https://www.example.com
envió los datos a https://api.example.com
ya que son dominios técnicamente diferentes?
¿Estoy sobrecomplicando esto?
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.
Me he encontrado con el mismo problema y lo he resuelto así.
1 Para aplicaciones de terceros que usan mi API, deben autenticarse a través de OAuth en todas las solicitudes.
2 Para mis propios clientes externos, (móvil, AIR, etc.): usan OAuth, con la diferencia de que les permití enviar el nombre de usuario y la contraseña directamente en el paso de autorización (para poder hacer un diálogo de inicio de sesión nativo). Esto se proporciona siempre que su API tenga SSL / HTTPS.
3 Para mi aplicación web, uso 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í).