Nginx community edition
Pré-requisitos
Este guia pressupõe que você tenha as seguintes condições:
- Serviço Casdoor em execução. If you haven't installed Casdoor service yet, see Server installation or Try with Docker.
- Edição de código aberto do Nginx com o módulo
ngx_http_auth_request_modulehabilitado no momento da compilação. See the Nginx auth_request module to enable it. - O site no qual você deseja habilitar a autenticação está implantado com sucesso no Nginx, com um nome de domínio configurado (em vez de usar um endereço IP) e pode ser acessado normalmente.
- OAuth2-Proxy (choose one of the two popular options on GitHub):
- oauth2-proxy/oauth2-proxy (usado neste artigo) GitHub OU Site Oficial
- vouch/vouch-proxy GitHub
I. Configurar Casdoor
Note: The Casdoor GUI may differ by version; use this article as a reference and adapt to your build.
Nota: As chaves, senhas, nomes de usuário e outras informações confidenciais mencionadas neste artigo são todos exemplos. Por razões de segurança, você deve substituí-las pelo seu próprio conteúdo relevante ao implantar.
-
Faça login na sua conta de administrador do Casdoor.
-
Na barra superior, selecione 'Autenticação de Identidade' > 'Aplicações', e então clique em 'Adicionar' na página 'Aplicações'.

-
Complete a configuração da aplicação com base nas informações do seu projeto. Neste artigo, usamos 'Nginx-Community' como o nome de aplicação de exemplo.

-
Anote os valores dos campos 'Client ID' e 'Client Secret'. Eles serão usados ao configurar o OAuth2-Proxy mais tarde. Em seguida, configure a 'URL de Redirecionamento' como
https://project.yourdomain.com/oauth2/callback/.
-
Na barra superior, selecione 'Gerenciamento de Permissões Casbin' > 'Funções', e então clique em 'Adicionar' na página 'Funções'.

-
Complete a configuração da função com base nas informações do seu projeto. Neste artigo, usamos 'nginx_role' como o nome da função de exemplo.

-
(Opcional) Na barra superior, selecione 'Gerenciamento de Usuários' > 'Usuários', e então adicione novos usuários conforme sua necessidade. If the users already exist, skip this step. Neste artigo, criamos um usuário de exemplo chamado 'user'.
-
Go back to the "Roles" page mentioned in step 5, edit the
nginx_rolerole, and add the required users to Included Users (e.g. the previously createdbuiltin/user).
II. Configurar 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.
Dicas: OAuth2-Proxy oferece vários métodos de implantação (como compilação de código-fonte, instalação via Docker, etc.). Para facilitar a explicação, este artigo usa o 'binário pré-construído' para implantação.
-
Vá para a página GitHub Releases e baixe o pacote binário correspondente ao seu sistema operacional e arquitetura de CPU. Até 1 de janeiro de 2024, a versão de lançamento mais recente do OAuth-Proxy é
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É altamente recomendável que você verifique o valor
SHA256SUMfornecido pelo site oficial na página GitHub Releases após baixar o pacote compactado e compare-o com o valorSHA256SUMdo pacote que você baixou, caractere por caractere. -
Extraia o pacote baixado:
tar -zxvf oauth2-proxy-*.tar.gz -
Entre no diretório extraído:
cd oauth2-proxy-v7.5.1.linux-amd64 -
Mova o arquivo binário obtido para
/usr/local/bine configure-o com permissões de execução. Você pode precisar elevar permissões usandosudodependendo da sua situação.cp ./oauth2-proxy /usr/local/bin
cd /usr/local/bin
chmod +x ./oauth2-proxy -
Teste a instalação do binário. Se a instalação for bem-sucedida, após executar o seguinte comando, você deve ver uma saída semelhante a
oauth2-proxy v7.5.1 (construído com go1.21.1).cd ~
oauth2-proxy --version -
Execute o oauth2-proxy com parâmetros de linha de comando. Parâmetros marcados com [obrigatório] devem ser configurados de acordo com sua situação específica, enquanto parâmetros marcados com [opcional] podem otimizar o desempenho, mas também podem ser omitidos. 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. Configurar 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.
Dicas: Nginx instalado usando a ferramenta do painel Baota não habilita este módulo por padrão.
-
Abra o arquivo de configuração do site que você já implantou e deseja proteger, e faça as seguintes modificações:
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;
} -
Salve o arquivo e recarregue seu Nginx.
Testando
- Next, test your implementation.
- Em circunstâncias normais, seus usuários passarão pelo seguinte processo ao fazer login no seu serviço:
- Abrir a URL
project.yourdomain.comem um navegador -> Ver apenas uma página que requer login, incluindo um botão chamado 'Entrar com OpenID Connect' -> Clicar no botão e ser redirecionado para o endereço do seu Casdoor, onde será solicitado a fazer login -> Usuários inserem seu nome de usuário e senha, e o Casdoor verifica suas credenciais -> Redirecionamento automático de volta para a sua URLproject.yourdomain.com-> Acesso bem-sucedido ao seu serviço -> Usuários serão solicitados a fazer login novamente quando o tempo--cookie-expireque você definiu expirar.
Solução de problemas
- 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.