Forward-Auth, otra opción para la función de autenticación
API7.ai
January 26, 2022
Forward Auth mueve inteligentemente la lógica de autenticación y autorización a un servicio externo dedicado, donde la puerta de enlace reenvía la solicitud del usuario al servicio de autenticación y bloquea la solicitud original, reemplazando el resultado cuando el servicio de autenticación responde con un estado no 20x. De esta manera, es posible devolver un error personalizado o redirigir al usuario a la página de autenticación si esta falla.
Principio
El principio y flujo del plugin forward-auth
en Apache APISIX se muestra en la figura anterior y se resume en los siguientes pasos.
- Paso 1: Un cliente realiza una solicitud a APISIX
- Paso 2: APISIX realiza una solicitud al servicio de autenticación configurado por el usuario
- Paso 3: El servicio de autenticación responde (2xx o estado de excepción)
- Paso 4: Basado en la respuesta del servicio de autenticación, APISIX decidirá reenviar la solicitud aguas arriba o enviar una respuesta de rechazo directamente al cliente
Cómo usarlo
Paso 1: Configurar el servicio de autenticación
Supongamos que existe un servicio de autenticación al que el usuario envía una solicitud con un encabezado de solicitud Authorization
. Si estos datos pasan la autenticación, se devuelve un código de estado 200 y un encabezado de respuesta llamado X-User-ID
; si no pasa la autenticación, se considera que el estado de autenticación ha expirado y se devuelve un código de estado 302 y un encabezado de respuesta Location
para redirigir al cliente a la página de inicio de sesión.
Paso 2: Crear una ruta y habilitar el plugin forward-auth
A continuación, configuraremos una ruta y habilitaremos el plugin forward-auth
para conectar el servicio de autenticación mencionado con la aplicación aguas arriba.
curl http://127.0.0.1:9080/apisix/admin/routes/1 -H 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1' -X PUT -d '
{
"plugins": {
"forward-auth": {
"address": "http://127.0.0.1:9080/auth",
"request_headers": ["Authorization"],
"upstream_headers": ["X-User-ID"],
"client_headers": ["Location"]
}
},
"uri": "/user"
}'
Los detalles de la configuración anterior se explican a continuación.
- Cuando una solicitud coincide con la ruta actual, se envía una solicitud a la
address
enaddress
con el encabezado de solicitudAuthorization
definido enrequest_headers
(es decir, el encabezado de solicitud configurado para ser reenviado por el cliente al servicio de autenticación, si no se establece, no se reenvía ningún encabezado de solicitud), lo que permite al servicio de autenticación confirmar la identidad del usuario. - Si la autenticación es exitosa, el código de estado es 200 y devuelve un
X-User-ID
como se define enupstream_headers
(es decir, el encabezado de solicitud que se reenviará aguas arriba por el servicio de autenticación cuando la autenticación sea exitosa, si no se establece, no se reenvía ningún encabezado de solicitud). - Si la autenticación falla, el código de estado es 302 y devuelve un
Location
como se define enclient_headers
(es decir, el encabezado de respuesta enviado por el servicio de autenticación al cliente si la autenticación falla, o ningún encabezado de respuesta si no está configurado).
Paso 3: Probar solicitudes
# Solicitud y envío de datos usando POST
curl http://127.0.0.1:9080/user \
--header 'Authorization: true'
HTTP/1.1 200 OK
Content-Type: application/json
Content-Length: 28
Server: APISIX/2.11.0
{"user_id":"i-am-real-user"}
# Solicitud usando GET
curl -i http://127.0.0.1:9080/user \
--header 'Authorization: false'
HTTP/1.1 302 FOUND
Server: APISIX/2.11.0
Location: https://example.com/auth
Anexo: Deshabilitar el plugin
Si ha terminado de usar el plugin Forward Auth, simplemente elimine la configuración del plugin forward-auth
de la configuración de la ruta y guárdela para desactivar el plugin Forward Auth en la ruta.
Gracias a la naturaleza dinámica de Apache APISIX, no es necesario reiniciar Apache APISIX para activar o desactivar el plugin.
Resumen
Para obtener más información sobre la descripción del plugin forward-auth
y la lista completa de configuraciones, puede consultar la documentación oficial. Además, si tiene escenarios de aplicación de autenticación o autorización más complejos, intente usar el plugin opa
, que permite una funcionalidad más potente de manera programable.
Apache APISIX también está trabajando actualmente en plugins adicionales para admitir la integración de servicios adicionales, por lo que si está interesado, no dude en iniciar una discusión en GitHub Discussion, o a través de la lista de correo para comunicarse.