Forward-Auth, Outra Opção para Função de Autenticação
API7.ai
January 26, 2022
O Forward Auth move inteligentemente a lógica de autenticação e autorização para um serviço externo dedicado, onde o gateway encaminha a solicitação do usuário para o serviço de autenticação e bloqueia a solicitação original, substituindo o resultado quando o serviço de autenticação responde com um status diferente de 20x. Dessa forma, é possível retornar um erro personalizado ou redirecionar o usuário para a página de autenticação caso a autenticação falhe.
Princípio
O princípio e o fluxo do forward-auth plugin
no Apache APISIX são mostrados na figura acima e resumidos nos seguintes passos.
- Passo 1: Uma solicitação é feita pelo cliente para o APISIX
- Passo 2: O APISIX faz uma solicitação para o serviço de autenticação configurado pelo usuário
- Passo 3: O serviço de autenticação responde (status 2xx ou exceção)
- Passo 4: Com base na resposta do serviço de autenticação, o APISIX decidirá encaminhar a solicitação para o upstream ou enviar uma resposta de rejeição diretamente para o cliente
Como usar
Passo 1: Configurar o serviço de autenticação
Suponha que haja um serviço de autenticação para o qual o usuário envia uma solicitação com um cabeçalho de solicitação Authorization. Se esses dados passarem na autenticação, um código de status 200 e um cabeçalho de resposta chamado X-User-ID
são retornados; se não passarem na autenticação, o status de autenticação é considerado expirado e um código de status 302 e o cabeçalho de resposta Location
são retornados para redirecionar o cliente para a página de login.
Passo 2: Criar uma rota e habilitar o plugin forward-auth
Em seguida, configuraremos uma rota e habilitaremos o plugin forward-auth
para conectar o serviço de autenticação acima com a aplicação upstream.
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"
}'
Os detalhes da configuração acima são explicados.
- Quando uma solicitação corresponde à rota atual, uma solicitação é enviada para o
address
no endereço com o cabeçalho de solicitação Authorization definido emrequest_headers
(ou seja, o cabeçalho de solicitação configurado para ser encaminhado pelo cliente para o serviço de autenticação, se não for definido, nenhum cabeçalho de solicitação é encaminhado), permitindo que o serviço de autenticação confirme a identidade do usuário. - Se a autenticação passar, o código de status será 200 e retornará um
X-User-ID
conforme definido emupstream_headers
(ou seja, o cabeçalho de solicitação a ser encaminhado para o upstream pelo serviço de autenticação quando a autenticação passar, se não for definido, nenhum cabeçalho de solicitação é encaminhado). - Se a autenticação falhar, o código de status será 302 e retornará um
Location
conforme definido emclient_headers
(ou seja, o cabeçalho de resposta enviado pelo serviço de autenticação para o cliente se a autenticação falhar, ou nenhum cabeçalho de resposta se não for definido).
Passo 3: Testar as solicitações
# Solicitação e envio de dados 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"}
# Solicitação 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
Adendo: Desabilitar o plugin
Se você terminou de usar o plugin Forward Auth, basta remover a configuração do plugin forward-auth
da configuração da rota e salvar para desativar o plugin Forward Auth na rota.
Graças à natureza dinâmica do Apache APISIX, não é necessário reiniciar o Apache APISIX para ativar e desativar o plugin.
Resumo
Para obter mais informações sobre a descrição do plugin forward-auth
e a lista completa de configurações, você pode consultar a documentação oficial. Além disso, se você tiver cenários de aplicação de autenticação ou autorização mais complexos, tente usar o plugin opa
, que permite funcionalidades mais poderosas de forma programável.
O Apache APISIX também está atualmente trabalhando em plugins adicionais para suportar a integração de serviços adicionais, então, se você estiver interessado, sinta-se à vontade para iniciar uma discussão no GitHub Discussion, ou via lista de e-mails para se comunicar.