Saltar al contenido principal

NginxCommunityVersion

Prerrequisitos

Esta guía asume que tienes las siguientes condiciones:

  • Servicio Casdoor en funcionamiento. Si aún no has instalado el servicio Casdoor, por favor consulta Instalación del Servidor o Prueba con Docker.
  • Edición de código abierto de Nginx con el módulo ngx_http_auth_request_module habilitado en el momento de la compilación. Si no sabes cómo habilitar el módulo ngx_http_auth_request_module, por favor consulta el Documento del Módulo de Nginx.
  • El sitio web en el que deseas habilitar la autenticación está exitosamente desplegado en Nginx, con un nombre de dominio configurado (en lugar de usar una dirección IP), y puede ser accedido normalmente.
  • Herramienta OAuth2-Proxy (actualmente, los siguientes dos proyectos populares con muchas estrellas están disponibles en GitHub, y necesitas elegir uno de ellos):
  1. oauth2-proxy/oauth2-proxy (usado en este artículo) GitHub O Sitio Oficial
  2. vouch/vouch-proxy GitHub

I. Configurar Casdoor

Nota: Las operaciones en este artículo se basan en la GUI de Casdoor en el momento de la publicación, pero la GUI de Casdoor puede cambiar dependiendo de la versión. Por favor, sigue las referencias proporcionadas en este artículo para configurar tu versión de Casdoor desplegada.

Nota: Las claves, contraseñas, nombres de usuario y otra información confidencial mencionada en este artículo son todos ejemplos. Por razones de seguridad, debes reemplazarlos con tu propio contenido relevante al desplegar.

  1. Inicia sesión en tu cuenta de administrador de Casdoor.

  2. En la barra superior, selecciona "Autenticación de Identidad" > "Aplicaciones", y luego haz clic en "Agregar" en la página de "Aplicaciones".

    addApp

  3. Completa la configuración de la aplicación basada en la información de tu proyecto. En este artículo, usamos "Nginx-Community" como el nombre de la aplicación de ejemplo.

    ConfigureApp

  4. Toma nota de los valores de los campos "Client ID" y "Client Secret". Se utilizarán al configurar OAuth2-Proxy más adelante. Luego configura la "URL de Redirección" como https://project.yourdomain.com/oauth2/callback/.

    RecordInfo

  5. En la barra superior, selecciona "Gestión de Permisos de Casbin" > "Roles", y luego haz clic en "Agregar" en la página de "Roles".

    AddRole

  6. Completa la configuración del rol basada en la información de tu proyecto. En este artículo, usamos "nginx_role" como el nombre del rol de ejemplo.

    ConfigureRole

  7. (Opcional) En la barra superior, selecciona "Gestión de Usuarios" > "Usuarios", y luego agrega nuevos usuarios según tus necesidades. Si los usuarios que necesitas ya existen, puedes omitir este paso. En este artículo, creamos un usuario de ejemplo llamado "usuario".

  8. Vuelve a la página de "Roles" mencionada en el paso 5, edita el rol nginx_role, y agrega los usuarios que necesitas a la opción "Usuarios Incluidos". En este artículo, agregamos el builtin/user creado previamente aquí.

II. Configurar Oauth2-Proxy

Nota: Este artículo utiliza el proyecto Oauth2-Proxy como ejemplo. Si deseas usar Vouch en lugar de Oauth2-Proxy, por favor consulta su documentación oficial en GitHub.

Nota: Este artículo asume que tu sitio está configurado con un certificado SSL de confianza y solo permite el acceso HTTPS, o que has configurado una redirección automática de visitantes HTTP a HTTPS. Esto ayuda a maximizar la protección de las cookies y previene la lectura maliciosa de los tokens de inicio de sesión. Si tu sitio necesita ser accedido a través del protocolo HTTP inseguro, por favor modifica los comandos relevantes en consecuencia. Para obtener más ayuda con la implementación a través de HTTP, por favor consulta la documentación oficial de Oauth2-Proxy en GitHub.

Consejos: OAuth2-Proxy proporciona varios métodos de implementación (como compilación de código fuente, instalación de Docker, etc.). Para facilitar la explicación, este artículo utiliza el "binario preconstruido" para la implementación.

  1. Ve a la página de GitHub Releases y descarga el paquete binario correspondiente a tu sistema operativo y arquitectura de CPU. A partir del 1 de enero de 2024, la última versión de lanzamiento de OAuth-Proxy es V7.5.1. Si deseas descargar el paquete binario para esta versión, puedes ejecutar el siguiente comando para Linux con AMD64:

    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

    Se recomienda encarecidamente que verifiques el valor de SHA256SUM proporcionado por el sitio oficial en la página de GitHub Releases después de descargar el paquete comprimido y lo compares con el valor de SHA256SUM del paquete que descargaste, carácter por carácter.

  2. Extrae el paquete descargado:

    tar -zxvf oauth2-proxy-*.tar.gz
  3. Entra en el directorio extraído:

    cd oauth2-proxy-v7.5.1.linux-amd64
  4. Mueve el archivo binario obtenido a /usr/local/bin y configúralo con permisos de ejecución. Puede que necesites elevar permisos usando sudo dependiendo de tu situación.

    cp ./oauth2-proxy /usr/local/bin
    cd /usr/local/bin
    chmod +x ./oauth2-proxy
  5. Prueba la instalación del binario. Si la instalación es exitosa, después de ejecutar el siguiente comando, deberías ver una salida similar a oauth2-proxy v7.5.1 (construido con go1.21.1).

    cd ~
    oauth2-proxy --version
  6. Ejecuta oauth2-proxy con parámetros de línea de comandos. Los parámetros marcados con [requerido] deben ser configurados de acuerdo a tu situación específica, mientras que los parámetros marcados con [opcional] pueden optimizar el rendimiento pero también pueden ser omitidos. Para asegurar que oauth2-proxy pueda ejecutarse en segundo plano, puedes usar herramientas de monitoreo de procesos como Screen o Supervisor o herramientas de terminal.

    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] Please generate a random string of numbers and letters and fill it in here
    --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 that oauth2-proxy listens on. The port number here can be set arbitrarily. Please record the value you set, as it will be needed for configuring Nginx 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. If you don't need Redis, you can delete this item.
    --redis-connection-url=redis://127.0.0.1:6379/0 \ #[optional] Redis URL. If you don't need Redis, you can delete this item.
    --redis-password=123456 #[optional] Redis connection password. If you don't need Redis or Redis has no password, you can delete this item.

III. Configurar Nginx

Nota: Por favor, confirma de nuevo que tu Nginx ha habilitado el módulo ngx_http_auth_request_module al compilar e instalar desde el código fuente (el comando de compilación incluye --with_http_auth_request_module). Si no sabes cómo habilitar el módulo ngx_http_auth_request_module, por favor consulta el Documento del Módulo de Nginx.

Consejos: Nginx instalado usando la herramienta del panel Baota no habilita este módulo por defecto.

  1. Abre el archivo de configuración del sitio web que ya has desplegado y quieres proteger, y realiza las siguientes modificaciones:

    Nota: Necesitas ajustar este archivo de configuración de acuerdo a tu situación específica. Debido a las versiones de Nginx y otros factores, este archivo de configuración puede no funcionar sin problemas en todas las instancias de Nginx. Por favor, ajusta el contenido relevante basado en tu propia información de Nginx.

    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. Guarda el archivo y recarga tu Nginx.

Pruebas

  • A continuación, puedes probar tu implementación.
  • En circunstancias normales, tus usuarios pasarán por el siguiente proceso al iniciar sesión en tu servicio:
  • Abrir la URL project.yourdomain.com en un navegador -> Solo ver una página que requiere inicio de sesión, incluyendo un botón llamado "Iniciar sesión con OpenID Connect" -> Hacer clic en el botón y ser redirigido a tu dirección de Casdoor, donde se les pedirá que inicien sesión -> Los usuarios ingresan su nombre de usuario y contraseña, y Casdoor verifica sus credenciales -> Redirección automática de vuelta a tu URL project.yourdomain.com -> Acceso exitoso a tu servicio -> A los usuarios se les pedirá que inicien sesión nuevamente cuando expire el tiempo de --cookie-expire que configuraste.

Resolución de problemas

  • Si tu proyecto no funciona como se espera, por favor verifica la corrección de tu configuración de Nginx y los parámetros de configuración de Oauth2-Proxy.
  • También puedes consultar la documentación oficial de Oauth2-Proxy en GitHub.
  • Si encuentras algún error en este documento, no dudes en solicitar ediciones en GitHub.