una sirve seguridad qué por para ejemplo diseño autenticacion arquitectura facebook rest authentication openid facebook-authentication

facebook - sirve - seguridad api rest



REST API para el sitio web que utiliza Facebook para la autenticación (3)

Tenemos un sitio web donde la única forma de iniciar sesión y autenticarse con el sitio es con Facebook (esta no fue mi elección). La primera vez que inicie sesión con Facebook, se creará automáticamente una cuenta para usted.

Ahora queremos crear una aplicación de iPhone para nuestro sitio y también una API pública para que otros puedan usar nuestro servicio.

Esta pregunta se trata de cómo autenticarse con nuestro sitio web desde la aplicación / API y está dividida en 2 partes:

  1. ¿Cuál es la forma correcta de manejar la autenticación REST desde una API a un sitio web que solo usa Facebook OAuth como método de autenticación?

    He leído e investigado mucho sobre los métodos estándar de autenticación para API REST. No podemos usar métodos como la autenticación básica sobre HTTPS , ya que no hay credenciales para un usuario como tal. Algo así parece ser solo para autenticar aplicaciones que usan la API.

    Actualmente, la mejor manera que puedo pensar es que aciertes un punto final / authorize en nuestra API, redirecciona a Facebook OAuth, luego redirige al sitio y proporciona un ''token'' que el usuario de la API puede usar para autenticar posteriores peticiones.

  2. Para una aplicación oficial que creamos, no necesariamente necesitaríamos usar la API pública de la misma manera. ¿Cuál sería la mejor manera de hablar con nuestro sitio web y autenticar a los usuarios?

Entiendo (creo) cómo autenticar aplicaciones de terceros que están utilizando nuestra API, usando claves API (públicas) y claves secretas (privadas). Sin embargo, cuando se trata de autenticar al usuario que está usando la aplicación, me siento bastante confundido acerca de cómo hacerlo cuando la única manera de autenticar a un usuario es Facebook.

Siento que me falta algo muy obvio, o no entiendo completamente cómo deberían funcionar las API REST públicas, por lo que cualquier consejo y ayuda sería muy apreciado.


ACTUALIZACIÓN: ver a continuación

He estado pensando mucho sobre esta pregunta también. Todavía no está del todo claro para mí, pero esta es la ruta a la que estoy pensando ir. Estoy creando una API REST y mis usuarios solo autentican con Facebook Connect.

En el CLIENTE:

  1. Use la API de Facebook para iniciar sesión y obtenga un código OAUTH2.
  2. Intercambia este código por un token de acceso.
  3. En cada llamada a mi API personalizada, incluiré el ID de usuario de Facebook y el token de acceso.

En la API (para cada método que requiere autenticación de usuario):

  1. Realice una solicitud al gráfico / me de Facebook utilizando el token de acceso de arriba.
  2. Verifique que el ID de usuario de Facebook devuelto coincida con el ID de usuario pasado a mi API desde arriba.
  3. Si el token de acceso ha caducado, se requiere comunicación adicional.

Todavía tengo que probar esto. ¿Como suena?

--- Actualización: 27 de julio de 2014 para responder pregunta ---

Solo uso el intercambio anterior una vez que inicie sesión. Una vez que determino qué usuario está iniciando sesión, creo mi propio token de acceso, y ese token se utiliza desde ese punto en adelante. Entonces, el nuevo flujo se ve así ...

En el CLIENTE:

  1. Use la API de Facebook para iniciar sesión y obtenga un código OAUTH2.
  2. Intercambia este código por un token de acceso.
  3. Solicite un token de acceso de mi API, incluido el token de Facebook como parámetro

En la API

  1. Recibir solicitud de token de acceso
  2. Realice una solicitud al gráfico / me de Facebook utilizando el token de acceso de Facebook
  3. Verifique que el usuario de Facebook exista y coincida con un usuario en mi base de datos
  4. Crear mi propio token de acceso, guardarlo y devolverlo al cliente para usarlo a partir de este momento

Esta es mi implementación usando JWT (JSON Web Tokens), básicamente similar a la respuesta actualizada de Chris. He usado Facebook JS SDK y JWT.

Aquí está mi implementación.

  1. Cliente: use Facebook JS SDK para iniciar sesión y obtener el token de acceso.

  2. Cliente: solicite JWT desde mi API llamando al /verify-access-token endpoint de /verify-access-token .

  3. MyAPI: recibe el token de acceso, verifíquelo llamando /me punto final de la API de Facebook.

  4. MyAPI: si el token de acceso es válido, encuentra al usuario de la base de datos, inicia sesión en el usuario si existe. Cree un JWT con los campos obligatorios como carga útil, establezca un vencimiento, firme con la clave secreta y envíe de vuelta al cliente.

  5. Cliente: Almacena el JWT en el almacenamiento local.

  6. Cliente: envía el token junto con la solicitud de la próxima llamada a la API.

  7. MyAPI: valida el token con la clave secreta, si el token es válido, intercambia el token por uno nuevo, envíalo de vuelta al cliente junto con la respuesta de la API. (No hay llamadas API externas para la verificación del token aquí después) [si el token es cliente de solicitud no válido / caducado para autenticarse nuevamente y repetir desde 1]

  8. Cliente Reemplaza el token almacenado con el nuevo y lo usa para la próxima llamada API. Una vez que se cumple el vencimiento del token, el token vence la revocación del acceso a la API.

Cada token se usa una vez.

Lea más respuestas sobre seguridad y JWT

Qué tan seguro es JWT

Si puedes decodificar JWT, ¿cómo están seguros?

JSON Web Tokens (JWT) como identificación de usuario y tokens de autenticación


Estoy tratando de responder la misma pregunta y he estado leyendo un montón recientemente ...

No tendré "la" respuesta, pero las cosas se aclaran un poco para mí. ¿Has leído los comentarios en this ? Los encontré realmente interesantes y útiles.

Como resultado, y a la luz de cómo han evolucionado las cosas desde que se escribió el primer artículo, esto es lo que creo que haré:

  • HTTPS en todas partes: esto le permite olvidarse de HMAC, firmar, nonce, ...

  • Use OAuth2:

    • Cuando las solicitudes de autenticación provienen de mis propias aplicaciones / sitio web, use este ''truco'' (o una variación de este) descrito en una respuesta al artículo mencionado anteriormente.

    • En mi caso, tengo dos tipos de usuarios: aquellos con credenciales de inicio de sesión / contraseña clásicas y aquellos que se han registrado con Facebook Connect.
      Así que proporcionaría un formulario de inicio de sesión regular con el botón "Iniciar sesión con Facebook". Si el usuario inicia sesión con sus credenciales "clásicas", simplemente las enviaría a mi punto final OAuth2 con una grant_type=password .
      Si elige iniciar sesión a través de Facebook, creo que sería un proceso de dos pasos:

      • Primero, use Facebook SDK de iOS para abrir una FBSession
      • Cuando se haya hecho eso y se le devuelva el control a la aplicación, debería haber una forma de obtener una identificación de Facebook para ese usuario. Enviaría este ID solo a mi punto final OAuth2 con una concesión de extensión entendida por mi servidor como "usando un ID de usuario de FB".

Tenga en cuenta que todavía estoy investigando mucho sobre todo esto, por lo que podría no ser una respuesta perfecta ... ¡tal vez ni siquiera la correcta! Pero creo que eso sería un buen punto de partida. ¿La idea de utilizar una "concesión de extensión" para la autenticación de Facebook podría implicar tener que registrarla para hacer las cosas correctamente? No estoy muy seguro.

De todos modos, espero poder ayudarte incluso un poco, y que al menos puede iniciar una discusión para encontrar la mejor solución a este problema :)

Actualizar
El inicio de sesión de Facebook no es una solución como se señaló en los comentarios: cualquiera podría enviar un ID de usuario arbitrario e iniciar sesión como este usuario en la API.

¿Qué tal si lo haces así?

  • Mostrar un formulario de inicio de sesión con un botón de "inicio de sesión en Facebook"
  • Si se elige este método de inicio de sesión, actúe como el SDK de Facebook: abra una página web desde su servidor de autenticación, que iniciará el inicio de sesión de Facebook.
  • Una vez que el usuario haya iniciado sesión, Facebook usará su URL de redireccionamiento para confirmar; hacer que esa URL apunte a otro punto final de su servidor de autenticación (posiblemente con un parámetro adicional que indique que la llamada provino de una aplicación).
  • Cuando se acierta el punto final de autenticación, la autenticación puede identificar al usuario de forma segura, retener su FB User ID / FB Session y devolver un token de acceso a su aplicación utilizando un esquema de URL personalizado, tal como lo haría el SDK de Facebook.

¿Se ve mejor?