Passer au contenu principal

Nginx community edition

Prérequis

Ce guide suppose que vous avez les conditions suivantes :

  • Service Casdoor en fonctionnement. If you haven't installed Casdoor service yet, see Server installation or Try with Docker.
  • Édition open-source de Nginx avec le module ngx_http_auth_request_module activé lors de la compilation. See the Nginx auth_request module to enable it.
  • Le site web sur lequel vous souhaitez activer l'authentification est déployé avec succès sur Nginx, avec un nom de domaine configuré (au lieu d'utiliser une adresse IP), et peut être normalement accessible.
  • OAuth2-Proxy (choose one of the two popular options on GitHub):
  1. oauth2-proxy/oauth2-proxy (utilisé dans cet article) GitHub OU Site Officiel
  2. vouch/vouch-proxy GitHub

I. Configurer Casdoor

Note: The Casdoor GUI may differ by version; use this article as a reference and adapt to your build.

Remarque : Les clés, mots de passe, noms d'utilisateur et autres informations confidentielles mentionnés dans cet article sont tous des exemples. Pour des raisons de sécurité, vous devez les remplacer par votre propre contenu pertinent lors du déploiement.

  1. Connectez-vous à votre compte administrateur Casdoor.

  2. Dans la barre supérieure, sélectionnez "Authentification d'Identité" > "Applications", puis cliquez sur "Ajouter" sur la page "Applications".

    addApp

  3. Complétez la configuration de l'application en fonction des informations de votre projet. Dans cet article, nous utilisons "Nginx-Community" comme nom d'application exemple.

    ConfigureApp

  4. Prenez note des valeurs des champs "Client ID" et "Client Secret". Ils seront utilisés lors de la configuration d'OAuth2-Proxy plus tard. Configurez ensuite l'URL de redirection comme https://project.yourdomain.com/oauth2/callback/.

    RecordInfo

  5. Dans la barre supérieure, sélectionnez "Gestion des Permissions Casbin" > "Rôles", puis cliquez sur "Ajouter" sur la page "Rôles".

    AddRole

  6. Complétez la configuration du rôle en fonction des informations de votre projet. Dans cet article, nous utilisons "nginx_role" comme nom de rôle exemple.

    ConfigureRole

  7. (Facultatif) Dans la barre supérieure, sélectionnez "Gestion des Utilisateurs" > "Utilisateurs", puis ajoutez de nouveaux utilisateurs en fonction de vos besoins. If the users already exist, skip this step. Dans cet article, nous créons un utilisateur exemple nommé "user".

  8. Go back to the "Roles" page mentioned in step 5, edit the nginx_role role, and add the required users to Included Users (e.g. the previously created builtin/user).

II. Configurer Oauth2-Proxy

Note: For Vouch instead of OAuth2-Proxy, see vouch-proxy on GitHub.

Note: This guide assumes HTTPS (or HTTP→HTTPS redirect). For HTTP-only deployment, adjust the commands and see OAuth2-Proxy docs.

Conseils : OAuth2-Proxy propose différentes méthodes de déploiement (telles que la compilation du code source, l'installation Docker, etc.). Pour faciliter l'explication, cet article utilise le "binaire pré-construit" pour le déploiement.

  1. Allez sur la page GitHub Releases et téléchargez le paquet binaire correspondant à votre système d'exploitation et à l'architecture de votre CPU. Au 1er janvier 2024, la dernière version de OAuth-Proxy est V7.5.1. To download the binary for this version on Linux AMD64, run:

    wget -O oauth2-proxy-linux.tar.gz https://github.com/oauth2-proxy/oauth2-proxy/releases/download/v7.5.1/oauth2-proxy-v7.5.1.linux-amd64.tar.gz

    Il est fortement recommandé de vérifier la valeur SHA256SUM fournie par le site officiel sur la page GitHub Releases après avoir téléchargé le paquet compressé et de la comparer caractère par caractère avec la valeur SHA256SUM du paquet que vous avez téléchargé.

  2. Extrayez le paquet téléchargé :

    tar -zxvf oauth2-proxy-*.tar.gz
  3. Entrez dans le répertoire extrait :

    cd oauth2-proxy-v7.5.1.linux-amd64
  4. Déplacez le fichier binaire obtenu dans /usr/local/bin et configurez-le avec des permissions exécutables. Vous devrez peut-être élever les permissions en utilisant sudo en fonction de votre situation.

    cp ./oauth2-proxy /usr/local/bin
    cd /usr/local/bin
    chmod +x ./oauth2-proxy
  5. Testez l'installation binaire. Si l'installation est réussie, après avoir exécuté la commande suivante, vous devriez voir une sortie similaire à oauth2-proxy v7.5.1 (construit avec go1.21.1).

    cd ~
    oauth2-proxy --version
  6. Exécutez oauth2-proxy avec des paramètres en ligne de commande. Les paramètres marqués avec [requis] doivent être configurés selon votre situation spécifique, tandis que les paramètres marqués avec [facultatif] peuvent optimiser les performances mais peuvent également être omis. To run oauth2-proxy in the background, use a process manager such as Screen, Supervisor, or a terminal multiplexer.

    oauth2-proxy \ 
    --provider=oidc \ #[required] Do not change
    --client-id=abc123456def \ #[required] "Client ID" obtained in step I.4 above
    --client-secret=abc123456def \ #[required] "Client Secret" obtained in step I.4 above
    --oidc-issuer-url=https://auth.yourdomain.com \ #[required] Your Casdoor URL (domain name or public IP)
    --redirect-url=https://project.yourdomain.com/oauth2/callback \ #[required] https://domain-of-the-project-to-protect/oauth2/callback
    --scope=email+profile+groups+openid \ #[required] Obtained from Casdoor: user email, user profile, groups, and login authentication
    --cookie-domain=project.yourdomain.com \ #[required] Domain name of the project you want to protect
    --whitelist-domain=project.yourdomain.com \ #[required] Domain name of the project you want to protect
    --cookie-secret=abc123456def \ #[required] Use a random string (letters and numbers)
    --email-domain=* \ #[required] List of acceptable user email domains (* means accept all domains). If the user's email suffix is not in this list, a 403 error will be returned even if the login is successful.
    --insecure-oidc-allow-unverified-email=true \ #[required] Whether to accept users with unverified email addresses
    --http-address=http://127.0.0.1:65534 \ #[required] Address oauth2-proxy listens on; note this for the Nginx config later.
    --cookie-expire=24h0m0s \ #[optional] Cookie expiration time. After this period, users will need to log in again.
    --custom-sign-in-logo=https://cdn.yourdomain.com/pic/proj.png \ #[optional] Icon displayed on the login page. It is recommended to use a rectangular image rather than a square one.
    --session-store-type=redis \ #[optional] Use Redis cache. Omit if not using Redis.
    --redis-connection-url=redis://127.0.0.1:6379/0 \ #[optional] Redis URL. Omit if not using Redis.
    --redis-password=123456 #[optional] Redis password. Omit if not using Redis or if Redis has no password.

III. Configurer Nginx

Note: If building Nginx from source, ensure ngx_http_auth_request_module is enabled (add --with_http_auth_request_module). See the Nginx auth_request module.

Conseils : Nginx installé à l'aide de l'outil de panneau Baota n'active pas ce module par défaut.

  1. Ouvrez le fichier de configuration du site web que vous avez déjà déployé et que vous souhaitez protéger, et apportez les modifications suivantes :

    Note: Adjust the config for your setup; Nginx version and environment may require changes.

    server {
    listen 443 ssl http2;

    include /path/to/ssl.conf;

    # Add the following content
    location ^~ /oauth2/ {
    proxy_pass http://127.0.0.1:65534; # Change this to the "--http-address" configured in step II.6

    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Scheme $scheme;

    proxy_set_header X-Auth-Request-Redirect $request_uri;
    # or, if you are handling multiple domains:
    # proxy_set_header X-Auth-Request-Redirect $scheme://$host$request_uri;
    }
    location = /oauth2/auth {
    proxy_pass http://127.0.0.1:65534; # Change this to the "--http-address" configured in step II.6

    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Scheme $scheme;
    proxy_set_header Content-Length "";
    proxy_pass_request_body off;
    }
    location ^~ / {
    auth_request /oauth2/auth;
    error_page 401 = /oauth2/sign_in;

    auth_request_set $user $upstream_http_x_auth_request_user;
    auth_request_set $email $upstream_http_x_auth_request_email;
    proxy_set_header X-User $user; # Pass the username of the user logged in to your backend service
    proxy_set_header X-Email $email; # Pass the email of the user logged in to your backend service

    auth_request_set $token $upstream_http_x_auth_request_access_token;
    proxy_set_header X-Access-Token $token; # Pass the user's login token to your backend service

    # The following configurations are related to cookie validation for user login
    auth_request_set $auth_cookie $upstream_http_set_cookie;
    add_header Set-Cookie $auth_cookie;

    auth_request_set $auth_cookie_name_upstream_1 $upstream_cookie_auth_cookie_name_1;

    if ($auth_cookie ~* "(; .*)") {
    set $auth_cookie_name_0 $auth_cookie;
    set $auth_cookie_name_1 "auth_cookie_name_1=$auth_cookie_name_upstream_1$1";
    }

    if ($auth_cookie_name_upstream_1) {
    add_header Set-Cookie $auth_cookie_name_0;
    add_header Set-Cookie $auth_cookie_name_1;
    }
    proxy_no_cache $cookie_session;

    # Provide the web page to the user after successful validation

    proxy_pass http://127.0.0.1:8080; # The address where your backend service runs
    # Note: This is not the Casdoor deployment address or the Oauth2-Proxy running address, but the address where your backend service that needs login protection runs.

    # Then add configurations to pass user IP, Connection request headers, etc., to your backend service, for example:
    proxy_set_header X-Forwarded-For $remote_addr;
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection upgrade;
    proxy_set_header Accept-Encoding gzip;
    }
    access_log /path/to/access_log.log;
    error_log /path/to/error_log.log;
    }
  2. Enregistrez le fichier et rechargez votre Nginx.

Test

  • Next, test your implementation.
  • Dans des circonstances normales, vos utilisateurs passeront par le processus suivant lors de la connexion à votre service :
  • Ouvrez l'URL project.yourdomain.com dans un navigateur -> Ne voyez qu'une page nécessitant une connexion, y compris un bouton nommé "Se connecter avec OpenID Connect" -> Cliquez sur le bouton et soyez redirigé vers votre adresse Casdoor, où il vous sera demandé de vous connecter -> Les utilisateurs entrent leur nom d'utilisateur et leur mot de passe, et Casdoor vérifie leurs informations d'identification -> Redirection automatique vers votre URL project.yourdomain.com -> Accès réussi à votre service -> On demandera aux utilisateurs de se connecter à nouveau lorsque le temps --cookie-expire que vous avez défini expirera.

Dépannage

  • If it does not run as expected, check your Nginx and OAuth2-Proxy configuration.
  • See OAuth2-Proxy documentation.
  • To suggest fixes for this doc, open an issue or PR on GitHub.