api authentication authorization passport.js

¿Qué estrategia de autenticación debo usar para mi API?



authentication authorization (1)

Es importante entender la diferencia entre las aplicaciones web y los servicios web. Una aplicación web sirve marcado, JavaScript, CSS y archivos de imagen y, a menudo utiliza la autenticación basada en cookies (pero puede utilizar cualquier otro mecanismo de autenticación implícita ). Cualquier solicitud que realice el navegador se autentica automáticamente.

Los servicios web, por otro lado, a menudo usan autenticación token de portador. Cuando un cliente en un navegador, un cliente avanzado o en un dispositivo móvil se comunica con la API, envía un token en el encabezado Authorization de la solicitud HTTP. El encabezado debe adjuntarse explícitamente a la solicitud en el código JavaScript o nativo que ejecuta la solicitud HTTP.

En aplicaciones de una sola página (SPA), falta la aplicación web y el marcado, JavaScript, CSS e imágenes se sirven desde el navegador sin autenticación. Solo las solicitudes a los servicios web son autenticadas, generalmente usando un token JWT.

En su caso, si desea que solo los usuarios autorizados puedan descargar imágenes y otros archivos, debe considerar la creación de una aplicación web. Use un protocolo de seguridad como OpenID Connect para autenticar a sus usuarios. Elija un servidor de autorización que admita OpenID Connect para su aplicación web y OAuth2 para su servicio web.

Tengo una aplicación angular-js del lado del cliente. Y tengo una API nodejs del lado del servidor. La aplicación del lado del cliente y la del lado del servidor se encuentran en diferentes dominios. La API de uso del lado del cliente para obtener o publicar algunos datos. También el lado del cliente necesita obtener imágenes del lado del servidor y mostrarlas en un navegador.

Utilizo el módulo pasaporte nodejs para la autenticación. No sé qué estrategia de autenticación es mejor para mí. Creo que hay dos tipos de estrategias de autenticación: basadas en tokens y basadas en cookies. Y creo que ambos tipos son inútiles en mi caso:

  1. Si utilizo estrategias basadas en token, entonces debería enviar un encabezado de Autenticación con un token en cada solicitud a la API. Puedo enviar encabezados en las solicitudes AJAX, pero si quiero mostrar una imagen que se encuentra en el lado del servidor, tengo un problema. Porque un navegador no enviará encabezados en la etiqueta <img> .

  2. Si uso cookies, entonces no tengo el problema con las imágenes. Pero tengo problemas con las solicitudes de AJAX. Porque la cookie de sesión se almacena en el dominio de la aplicación del lado del servidor. Y si envío solicitudes AJAX desde el dominio del lado del cliente, entonces debería enviar cookies con cada solicitud. Utilizo XmlHttpRequest para AJAX y debería usar la opción deCredentials para enviar cookies. Pero en solicitudes de dominios cruzados, los navegadores enviarán una solicitud de verificación previa (OPTION) antes de cada solicitud de AJAX. Y los navegadores no enviarán cookies con la solicitud de OPCIÓN. Esto es un problema para mí porque la API del lado del servidor no pudo hacer una respuesta correcta en una solicitud OPCIÓN si no se autoriza.

¿Cuál es la solución adoptada?