Asegurar mi API REST con OAuth mientras aún permite la autenticación a través de proveedores de OAuth de terceros (usando DotNetOpenAuth)


138

Tengo un producto con una API REST sencilla para que los usuarios del producto puedan integrarse directamente con las características del producto sin usar mi interfaz de usuario web.

Recientemente, he recibido interés de varios terceros sobre la integración de sus clientes de escritorio con la API para permitir a los usuarios de mi producto acceder a sus datos utilizando esa aplicación de terceros.

He visto que las aplicaciones que desean usar Twitter se autentican mediante una página de inicio de sesión alojada por Twitter que otorga permiso a una aplicación específica para acceder a los datos de ese usuario. Hace clic en el botón "Permitir" o "Denegar" y se completa el proceso de autenticación. Facebook usa el mismo mecanismo que mejor puedo decir.

Tras una investigación adicional, esto parece ser OAuth en acción, y dado que mi API está basada en .Net, creo que debería usar DotNetOpenAuth y proporcionar un mecanismo similar. Desafortunadamente, las muestras están escasamente documentadas (si es que las hay) y los únicos tutoriales que puedo encontrar en línea parecen estar enfocados en ayudarlo a proporcionar un mecanismo de inicio de sesión para sus usuarios para que puedan iniciar sesión en su sitio web utilizando un proveedor externo.

Lo que realmente me gustaría hacer es que mi API REST maneje toda la autenticación central y la lógica comercial de mi aplicación web y que, bajo el capó, mi aplicación web sea esencialmente otra aplicación que simplemente use la API a través de OAuth. Los usuarios se autenticarían en el sitio web directamente usando su nombre de usuario y contraseña, o mediante un proveedor externo como MyOpenID o Facebook y luego el sitio web de alguna manera usaría el token devuelto para autenticarse en la API REST.

Diagrama Arquitectónico

Básicamente parece que necesito mi API para alojar de alguna manera un servicio OAuth, pero también que los usuarios usen un servicio OAuth de terceros. No puedo evitar pensar que no tengo suficiente conocimiento de OAuth para decidir si estoy complicando demasiado las cosas o si lo que estoy tratando de hacer es una forma buena o mala de hacer las cosas.

¿Puede alguien darme al menos una visión general de los pasos que debo seguir, o qué debo mirar para que esto suceda? ¿O señalarme algunos tutoriales? ¿O arruinar mi propuesta y decirme que me estoy equivocando (arquitectónicamente)?


Hola Nathan, estoy luchando con un escenario similar al que describes aquí y me preguntaba si tenías algo que agregar a mi pregunta o consejo sobre cómo solucionar mi falta de comprensión actual sobre la integración de OpenID con mi API stackoverflow.com/ preguntas / 16855131 / ...
Jammer

Respuestas:


123

Primero me gustaría enfatizar la diferencia entre autenticación y autorización:

Un usuario se autentica en su sitio web al proporcionar algunas credenciales, como un nombre de usuario + contraseña. OpenID permite que esto se desplace haciendo que el usuario se autentique en otro servicio, que luego afirma la identidad del usuario en su sitio web en nombre del usuario. Su sitio confía en el servicio de terceros (el proveedor de OpenID) y, por lo tanto, considera al usuario conectado.

Un servicio o aplicación no se autentica en su sitio web, al menos normalmente. Un usuario autoriza un servicio o aplicación para acceder a los datos del usuario. Esto normalmente se hace cuando la aplicación solicita la autorización del proveedor de servicios, luego envía al usuario al proveedor de servicios, donde el usuario primero se autentica (para que el proveedor de servicios sepa con quién está hablando) y luego el usuario dice al sitio "sí, está bien que [aplicación] acceda a mis datos [de alguna manera restringida] ". A partir de entonces, la aplicación utiliza un token de autorización.para acceder a los datos del usuario en el sitio del proveedor de servicios. Tenga en cuenta que la aplicación no se autentica como si fuera el usuario, pero utiliza otro código para asegurar al servicio que está autorizada para acceder a los datos de un usuario en particular.

Entonces, con esa distinción aclarada, puede tomar decisiones en su sitio sobre autenticación y autorización de manera completamente independiente. Por ejemplo, si desea que sus usuarios puedan iniciar sesión con todos: nombre de usuario + contraseña, OpenID y Facebook, puede hacerlo. Una decisión completamente ortogonal es cómo autoriza las aplicaciones (hay muchos protocolos que puede usar para esto, OAuth, por supuesto, es bastante popular).

OpenID se centra en la autenticación de usuarios . OAuth se centra en la autorización de la aplicación . Sin embargo, algunos servicios como Facebook y Twitter han optado por usar OAuth para autenticación y autorización en lugar de usar OpenID para autenticación y OAuth para autorización.

Ahora para su propio proyecto, le recomiendo que consulte la plantilla de proyecto del sitio web ASPIDNET MVC 2 OpenID (C #) disponible en VS Gallery. De fábrica viene con autenticación OpenID y soporte de OAuth Service Provider. Esto significa que sus usuarios pueden iniciar sesión con OpenID, y las aplicaciones y servicios de terceros pueden usar OAuth para realizar llamadas API a su sitio web y acceder a los datos del usuario.

Parece que desearía agregar a esta plantilla de proyecto una vez que comience, es la posibilidad de que sus usuarios inicien sesión con nombre de usuario + contraseña, así como con OpenID. Además, si desea que Facebook y Twitter sean una opción para sus usuarios, debe implementar eso también, ya que no usan el estándar OpenID. Pero la descarga de DotNetOpenAuth incluye ejemplos para iniciar sesión con Twitter y Facebook, por lo que tiene alguna orientación allí.

Sospecho que no tendrá mucho que hacer en el frente de la autorización. Viene con OAuth como dije antes, y eso probablemente sea suficiente para ti.


Gracias por la respuesta detallada, revisaré el enlace que proporcionó. Para aclarar, mi API cuelga de un subdominio de mi sitio web, por lo que técnicamente no es la misma aplicación.
Nathan Ridley

1
El escenario atípico donde la aplicación necesita autenticarse en el servidor de autorización en lugar del usuario surge cuando los recursos son propiedad de la aplicación. Por ejemplo, una aplicación de Facebook puede solicitar al servidor de recursos de fb información de la aplicación y datos estadísticos que recopiló durante un período de tiempo. Este escenario se aborda en el flujo de trabajo de credenciales de cliente de OAuth2
SenG

¿Es posible puedo usar REST API sin oAuth? @Andrew Arnott
Gema

Por supuesto. No todas las API de descanso requieren autenticación en absoluto. Y oauth no es el único mecanismo de autenticación.
Andrew Arnott

11

Ante todo. Debe separar mentalmente cuál es su API, de los métodos de autenticación.

Su API es básicamente recursos y métodos para manipular esos recursos. Y puede tener varios métodos para autenticar el acceso a su API.

OAuth es uno de esos mecanismos de autenticación. Ser un proveedor de OAuth es excelente, aunque la especificación es un poco difícil de entender, especialmente las partes que tienen que ver con las firmas. Una vez que tiene OAuth en su lugar, las aplicaciones de cliente generalmente tienen una autenticación fácil, ya que hay tantas bibliotecas de "código abierto, ya hechas, solo implementar" disponibles en la mayoría de los idiomas.

Los pros y los contras de OAuth han sido debatidos por un tiempo. Pero para formar su propia opinión, sugiero leer esta guía definitiva, escrita por Eran Hammer-Lahav , una de las personas responsables de la especificación OAuth.

Por lo que yo veo, las únicas alternativas reales a OAuth son OAuth 2.0 y solo una autenticación básica simple.

Aparte de eso, estás hablando de autenticar usando Open-ID o identidad de Facebook, etc. Esta es otra pregunta que debes hacerte. Pero realmente queda fuera del alcance de las API y OAuth. Para mí, eso se siente más como una cuestión de creación de usuarios en su servicio. Puedo estar equivocado.


¿Es posible puedo usar REST API sin oAuth? @Jon Nylander
Gema
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.