Forward-Auth, une autre option pour la fonction d'authentification

API7.ai

January 26, 2022

Ecosystem

Forward Auth déplace intelligemment la logique d'authentification et d'autorisation vers un service externe dédié, où la passerelle transmet la demande de l'utilisateur au service d'authentification et bloque la demande originale, remplaçant le résultat lorsque le service d'authentification répond avec un statut non-20x. De cette manière, il est possible de retourner une erreur personnalisée ou de rediriger l'utilisateur vers la page d'authentification si l'authentification échoue.

Principe

Principe du plugin

Le principe et le flux du plugin forward-auth dans Apache APISIX sont illustrés dans la figure ci-dessus et résumés dans les étapes suivantes.

  • Étape 1 : Une demande est faite par le client à APISIX
  • Étape 2 : APISIX fait une demande au service d'authentification configuré par l'utilisateur
  • Étape 3 : Le service d'authentification répond (statut 2xx ou exception)
  • Étape 4 : En fonction de la réponse du service d'authentification, APISIX décidera de transférer la demande en amont ou d'envoyer une réponse de rejet directement au client

Comment utiliser

Étape 1 : Configurer le service d'authentification

Supposons qu'il existe un service d'authentification auquel l'utilisateur envoie une demande avec un en-tête de demande Authorization. Si ces données passent l'authentification, un code de statut 200 et un en-tête de réponse nommé X-User-ID sont retournés ; si elles ne passent pas l'authentification, le statut d'authentification est considéré comme expiré et un code de statut 302 et un en-tête de réponse Location sont retournés pour rediriger le client vers la page de connexion.

Étape 2 : Créer une route et activer le plugin forward-auth

Ensuite, nous configurerons une route et activerons le plugin forward-auth pour interfacer le service d'authentification ci-dessus avec l'application en amont.

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"
}'

Les détails de la configuration ci-dessus sont expliqués.

  • Lorsqu'une demande correspond à la route actuelle, une demande est envoyée à l'adresse address avec l'en-tête de demande Authorization défini dans request_headers (c'est-à-dire l'en-tête de demande configuré pour être transféré par le client au service d'authentification, s'il n'est pas défini, aucun en-tête de demande n'est transféré), ce qui permet au service d'authentification de confirmer l'identité de l'utilisateur.
  • Si l'authentification passe, le code de statut est 200 et retourne un X-User-ID tel que défini dans upstream_headers (c'est-à-dire l'en-tête de demande à transférer en amont par le service d'authentification lorsque l'authentification passe, s'il n'est pas défini, aucun en-tête de demande n'est transféré).
  • Si l'authentification échoue, le code de statut est 302 et retourne un Location tel que défini dans client_headers (c'est-à-dire l'en-tête de réponse envoyé par le service d'authentification au client si l'authentification échoue, ou aucun en-tête de réponse s'il n'est pas défini).

Étape 3 : Tester les demandes

# Demande et envoi de données en utilisant 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"}

# Demande en utilisant 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

Annexe : Désactiver le plugin

Si vous avez terminé d'utiliser le plugin Forward Auth, il suffit de supprimer la configuration du plugin forward-auth de la configuration de la route et de l'enregistrer pour désactiver le plugin Forward Auth sur la route.

Grâce à la nature dynamique d'Apache APISIX, il n'est pas nécessaire de redémarrer Apache APISIX pour activer ou désactiver le plugin.

Résumé

Pour obtenir plus d'informations sur la description du plugin forward-auth et la liste complète des configurations, vous pouvez consulter la documentation officielle. De plus, si vous avez des scénarios d'application d'authentification ou d'autorisation plus complexes, essayez d'utiliser le plugin opa, qui permet des fonctionnalités plus puissantes de manière programmable.

Apache APISIX travaille également actuellement sur des plugins supplémentaires pour prendre en charge l'intégration de services supplémentaires, donc si vous êtes intéressé, n'hésitez pas à démarrer une discussion dans GitHub Discussion, ou via la liste de diffusion pour communiquer.

Tags: