Usando Apache APISIX e Authing para Implementar Gerenciamento Centralizado de Autenticação
API7.ai
January 4, 2022
Introdução
Sobre o Apache APISIX
Apache APISIX é um gateway de API dinâmico, em tempo real e de alto desempenho que oferece recursos avançados de gerenciamento de tráfego, como balanceamento de carga, upstream dinâmico, lançamento canário, fusão de serviços, autenticação, observabilidade, etc. O Apache APISIX não apenas suporta mudanças dinâmicas de plug-ins e hot-plugging, mas também possui uma variedade de plug-ins úteis. O Plug-in OpenID Connect para Apache APISIX, com suporte ao protocolo OpenID Connect, permite que os usuários utilizem este plug-in para integrar o Apache APISIX com os serviços da Authing e implantá-lo como um gateway de autenticação centralizado em empresas.
Sobre a Authing
Authing é o primeiro produto de nuvem de identidade focado em desenvolvedores na China, integrando todos os principais protocolos de identidade e fornecendo serviços completos e seguros de autenticação e gerenciamento de acesso para empresas e desenvolvedores. Com "API First" como a base do produto, todas as funções comuns no campo de identidade são encapsuladas modularmente, e todas as capacidades são disponibilizadas aos desenvolvedores por meio de SDKs de linguagem de programação de cenário completo. Ao mesmo tempo, os usuários podem usar de forma flexível as APIs RESTful abertas da Authing para expansão de funcionalidades, atendendo às necessidades de gerenciamento de identidade de diferentes empresas em diversos cenários de negócios.
O que é Autenticação Centralizada
Modo Tradicional de Autenticação
No modo tradicional de autenticação, cada serviço de aplicação back-end precisa desenvolver funções separadas para suportar a funcionalidade de autenticação, como interagir com o provedor de identidade e obter as informações de identidade do usuário.
Modo de Autenticação de Identidade Centralizada
Diferente do modo tradicional de autenticação, o modo de autenticação centralizada remove a autenticação do usuário do serviço de aplicação. Tomando o Apache APISIX como exemplo, o processo de autenticação centralizada é mostrado na figura acima: primeiro, o usuário inicia uma solicitação, e então o gateway frontal é responsável pelo processo de autenticação do usuário, interagindo com o provedor de identidade e enviando uma solicitação de autorização ao provedor de identidade. O provedor de identidade retorna as informações do usuário. Após o gateway completar a identificação do usuário, ele encaminha as informações de identidade do usuário para a aplicação back-end na forma de um cabeçalho de solicitação.
Vantagens do Modo de Autenticação de Identidade Centralizada
Comparado ao modo tradicional de autenticação, o modo de autenticação centralizada oferece as seguintes vantagens.
- Simplifica o processo de desenvolvimento de aplicações, reduzindo a carga de trabalho de desenvolvimento e os custos de manutenção, evitando a repetição do desenvolvimento de lógica de autenticação para cada aplicação.
- Melhora a segurança do negócio, pois o modo de autenticação centralizada no nível do gateway pode interceptar solicitações não autenticadas a tempo de proteger as aplicações back-end.
Ao mesmo tempo, combinado com as poderosas funções de gerenciamento de autenticação da Authing, as seguintes funcionalidades podem ser alcançadas.
- Gerenciamento do ciclo de vida dos serviços de autenticação por meio do console, incluindo criação, ativação, desativação, etc.
- Monitoramento visual e em tempo real das aplicações, incluindo: número de solicitações de interface, latência de chamadas de interface e informações de erro de interface, com notificações de alarme em tempo real.
- Registro centralizado para visualizar facilmente logins, logouts e informações sobre ajustes e modificações na aplicação.
Mais detalhes podem ser encontrados em Authing Access Gateway.
Como implementar Autenticação de Identidade Centralizada usando Apache APISIX e Authing
Passo 1: Configurar a Authing
- Faça login na sua conta Authing, selecione "Build your own app" e preencha o nome da aplicação e o endereço de autenticação. Se você não tiver uma conta Authing, visite Authing, clique em "Login/Registrar" no canto superior direito para registrar uma conta Authing.
- Clique em "Criar" para criar uma aplicação Authing.
- Durante o processo de autenticação, a Authing rejeitará URLs de callback que não sejam as configuradas. Como este é um teste local, a URL de callback de login e a URL de callback de logout são ambas definidas como o endereço de acesso do APISIX http://127.0.0.1:9080/.
- Criar usuário (opcional). Na página de lista de usuários, crie um usuário com a conta e senha user1/user1, e você pode definir se permite o acesso à aplicação na página "Informações do Usuário - Gerenciamento de Autorização" (o padrão é permitir).
- Visite a página da aplicação para a seguinte configuração, que é necessária ao configurar o OpenID Connect do Apache APISIX.
- App ID: ID do cliente OAuth, ou seja, o ID da aplicação, correspondente a
client_id
e{YOUR_CLIENT_ID}
abaixo. - App secret: Segredo do cliente OAuth, ou seja, a chave da aplicação. Corresponde a
client_secret
e{YOUR_CLIENT_SECRET}
abaixo. - Service_discovery_address: O endereço de descoberta de serviço da aplicação. Corresponde a
{YOUR_DISCOVERY}
abaixo.
- App ID: ID do cliente OAuth, ou seja, o ID da aplicação, correspondente a
Passo 2: Instalar o Apache APISIX
Você pode instalar o Apache APISIX de várias maneiras, incluindo pacotes de origem, Docker, Helm Chart, etc.
Instalar dependências
O ambiente de execução do Apache APISIX requer dependências do NGINX e etcd.
Antes de instalar o Apache APISIX, instale as dependências de acordo com o sistema operacional que você está usando. Fornecemos instruções de instalação de dependências para CentOS7, Fedora 31 e 32, Ubuntu 16.04 e 18.04, Debian 9 e 10, e macOS. Consulte Instalar Dependências para mais detalhes.
Instalação via Pacote RPM (CentOS 7)
Este método de instalação é adequado para CentOS 7; execute o seguinte comando para instalar o Apache APISIX.
sudo yum install -y https://github.com/apache/apisix/releases/download/2.7/apisix-2.7-0.x86_64.rpm
Instalação via Docker
Consulte Instalando Apache APISIX com Docker.
Instalação via Helm Chart
Consulte Instalando Apache APISIX com Helm Chart.
Instalação via pacote de origem
- Crie um diretório chamado
apisix-2.7
.
mkdir apisix-2.7
- Baixe o pacote de origem do Apache APISIX Release.
wget https://downloads.apache.org/apisix/2.7/apache-apisix-2.7-src.tgz
Você também pode baixar o pacote de origem do Apache APISIX Release no site do Apache APISIX. A Página de Download do Site Oficial do Apache APISIX também fornece pacotes de origem para Apache APISIX, APISIX Dashboard e APISIX Ingress Controller.
- Extraia o pacote de origem do Apache APISIX Release.
tar zxvf apache-apisix-2.7-src.tgz -C apisix-2.7
- Instale as bibliotecas Lua necessárias para execução.
# Mude para o diretório apisix-2.7
cd apisix-2.7
# Crie as dependências
make deps
Inicializando Dependências
Execute o seguinte comando para inicializar o arquivo de configuração do NGINX e o etcd.
# inicialize o arquivo de configuração do NGINX e o etcd
make init
Passo 3: Iniciar o Apache APISIX e configurar a rota
-
Execute o seguinte comando para iniciar o Apache APISIX.
apisix start
-
Crie rotas e configure o plug-in OpenID Connect. A lista de configurações do OpenID Connect é a seguinte.
Campo | Valor Padrão | Descrição |
---|---|---|
client_id | N/A | ID do cliente OAuth |
client_secret | N/A | Segredo do cliente OAuth |
discovery | N/A | Endpoints de descoberta de serviço para provedores de identidade |
scope | openid | Escopo de recursos que precisa acessar |
relm | apisix | Especifica as informações de autenticação no cabeçalho de resposta WWW-Authenticate |
bearer_only | false | Se deve verificar o token no cabeçalho da solicitação |
logout_path | /logout | URI de logout |
redirect_uri | request_uri | O URI para o qual o provedor de identidade redireciona, por padrão o endereço da solicitação |
timeout | 3 | Tempo limite da solicitação em segundos |
ssl_verify | false | Se o certificado SSL do provedor de identidade deve ser verificado |
introspection_endpoint | N/A | O URL do endpoint de autenticação de token do provedor de identidade, que será extraído da resposta de descoberta se deixado em branco. |
introspection_endpoint_auth_method | client_secret_basic | Nome do método de autenticação para introspecção de token |
public_key | N/A | Chave pública para autenticação de token |
token_signing_alg_values_expected | N/A | Algoritmo para tokens de autenticação |
set_access_token_header | true | Se deve carregar o token de acesso no cabeçalho da solicitação |
access_token_in_authorization_header | false | O token de acesso é colocado no cabeçalho Authorization quando verdadeiro, e no cabeçalho X-Access-Token quando falso. |
set_id_token_header | false | Não carregar o token de ID no cabeçalho X-ID-Token da solicitação |
set_userinfo_header | false | Se deve carregar informações do usuário no cabeçalho X-Userinfo da solicitação |
O exemplo de código a seguir cria uma rota através da API Admin do Apache APISIX, definindo o upstream da rota para httpbin.org. httpbin.org
é um serviço back-end simples para receber e responder a solicitações, a página get
do httpbin.org
será usada abaixo, consulte http bin get.
Para itens de configuração específicos, consulte Plug-in OpenID Connect do Apache APISIX.
curl -XPOST 127.0.0.1:9080/apisix/admin/routes -H "X-Api-Key: edd1c9f034335f136f87ad84b625c8f1" -d '{
"uri":"/*",
"plugins":{
"openid-connect":{
"client_id":"{YOUR_CLIENT_ID}",
"client_secret":"{YOUR_CLIENT_SECRET}",
"discovery":"https://{YOUR_DISCOVERY}",
"scope":"openid profile",
"bearer_only":false,
"realm":"apisix",
"introspection_endpoint_auth_method":"client_secret_post",
"redirect_uri":"http://127.0.0.1:9080/"
}
},
"upstream":{
"type":"roundrobin",
"nodes":{
"httpbin.org:80":1
}
}
}'
Passo 4: Acessar o Apache APISIX
-
Acesse "http://127.0.0.1:9080/get" e a página será redirecionada para a página de login da Authing, pois o plug-in OpenID Connect já está ativado (esta página pode ser personalizada no console da Authing em "Aplicações - Branding").
-
Insira a senha da conta do usuário registrada na Authing, ou o usuário user1/user1 criado no Passo 1, e clique em Login para acessar a conta Authing.
-
Após o login bem-sucedido, você poderá acessar com sucesso a página get no httpbin.org. A página httpbin.org/get retornará os dados solicitados da seguinte forma.
... "X-Access-Token": "eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCIsImtpZCI6InFqeU55aVdVd2NhbUFxdEdVRUNCeFNsTWxQSWtTR2N1NmkyZzhEUk1OSGsifQ.eyJqdGkiOiJjTy16a0pCS0NSRFlHR2kyWkJhY0oiLCJzdWIiOiI2MWM5OGFmOTg0MjI4YWU0OTYyMDU4NTIiLCJpYXQiOjE2NDA1OTg4NTgsImV4cCI6MTY0MTgwODQ1OCwic2NvcGUiOiJvcGVuaWQgcHJvZmlsZSIsImlzcyI6Imh0dHBzOi8vYXBpc2l4LmF1dGhpbmcuY24vb2lkYyIsImF1ZCI6IjYxYzk4M2M0YjI4NzdkNDg2OWRkOGFjYiJ9.l2V8vDWcCObB1LjIhKs2ARG4J7WuB-0c-bnYZG2GP2zcpl6PMAPcId2B76CaXCU58ajGcfRmOlWJ67UaHrfWKv8IM4vcYN1gwhKdokSyrhEM31gQE-MzNEsEbPaVIGXdpR1N2JnAJK5-tKIjopDAXSwArfO6fQKTpjLhCi3COIA169WGRR4CKCwNzzpFAYP2ilNc18D_HRTBLS6UjxZSNUtWE5dbx7uBjblhwIwn5e1fxiEQcknVK8Dxf8NUliFECvr02HX2hNvmuCECkvA_mZYlshAeqidK8tSEXirAWsWS5jlXFqLiBJkhSHFrbxRyqeOSfJCJR_YcCwk9AzgZGg", "X-Id-Token": "eyJhdF9oYXNoIjoiRl8tRjZaUVgtWVRDNEh0TldmcHJmUSIsImJpcnRoZGF0ZSI6bnVsbCwiZmFtaWx5X25hbWUiOm51bGwsImdlbmRlciI6IlUiLCJnaXZlbl9uYW1lIjpudWxsLCJpc3MiOiJodHRwczpcL1wvYXBpc2l4LmF1dGhpbmcuY25cL29pZGMiLCJwaWN0dXJlIjoiaHR0cHM6XC9cL2ZpbGVzLmF1dGhpbmcuY29cL2F1dGhpbmctY29uc29sZVwvZGVmYXVsdC11c2VyLWF2YXRhci5wbmciLCJwcmVmZXJyZWRfdXNlcm5hbWUiOm51bGwsInVwZGF0ZWRfYXQiOiIyMDIxLTEyLTI3VDA5OjU0OjE3Ljc3M1oiLCJ3ZWJzaXRlIjpudWxsLCJ6b25laW5mbyI6bnVsbCwibmFtZSI6bnVsbCwiaWF0IjoxNjQwNTk4ODU4LCJuaWNrbmFtZSI6bnVsbCwibm9uY2UiOiJmMTlmZjhjODM5NzdmZjNlMDczMzZmMzg3Y2QxM2EzMSIsIm1pZGRsZV9uYW1lIjpudWxsLCJleHAiOjE2NDE4MDg0NTgsInN1YiI6IjYxYzk4YWY5ODQyMjhhZTQ5NjIwNTg1MiIsImxvY2FsZSI6bnVsbCwiYXVkIjoiNjFjOTgzYzRiMjg3N2Q0ODY5ZGQ4YWNiIiwicHJvZmlsZSI6bnVsbH0=", "X-Userinfo": "eyJ3ZWJzaXRlIjpudWxsLCJ6b25laW5mbyI6bnVsbCwibmFtZSI6bnVsbCwicHJvZmlsZSI6bnVsbCwibmlja25hbWUiOm51bGwsInN1YiI6IjYxYzk4YWY5ODQyMjhhZTQ5NjIwNTg1MiIsImxvY2FsZSI6bnVsbCwiYmlydGhkYXRlIjpudWxsLCJmYW1pbHlfbmFtZSI6bnVsbCwiZ2VuZGVyIjoiVSIsImdpdmVuX25hbWUiOm51bGwsIm1pZGRsZV9uYW1lIjpudWxsLCJwaWN0dXJlIjoiaHR0cHM6XC9cL2ZpbGVzLmF1dGhpbmcuY29cL2F1dGhpbmctY29uc29sZVwvZGVmYXVsdC11c2VyLWF2YXRhci5wbmciLCJwcmVmZXJyZWRfdXNlcm5hbWUiOm51bGwsInVwZGF0ZWRfYXQiOiIyMDIxLTEyLTI3VDA5OjU0OjE3Ljc3M1oifQ==" ...
X-Access-Token: O Apache APISIX coloca o token de acesso obtido do provedor de identidade no cabeçalho da solicitação
X-Access-Token
, opcionalmente no cabeçalho Authorization através deaccess_token_in_authorization_header
na configuração do plug-in.X-Id-Token: O Apache APISIX coloca o token de ID obtido do provedor de identidade no cabeçalho X-Id-Token após codificação base64, que pode ser ativado ou desativado por
set_id_token_header
na configuração do plug-in.X-Userinfo: O Apache APISIX coloca as informações do usuário obtidas do provedor de identidade no X-Userinfo após codificá-las em base64. Você pode escolher se deseja ativar esse recurso usando
set_userinfo_header
na configuração do plug-in.Como você pode ver, o Apache APISIX carregará os cabeçalhos de solicitação
X-Access-Token
,X-Id-Token
eX-Userinfo
para o upstream. O upstream pode analisar esses cabeçalhos para obter as informações de ID do usuário e os metadados do usuário. -
No "Log de Auditoria - Log de Comportamento do Usuário" no console da Authing, você pode observar as informações de login do user1.
Resumo
Este artigo descreve os passos detalhados para integrar o Apache APISIX com a Authing.
O Apache APISIX não apenas se compromete a manter seu próprio alto desempenho, mas também sempre deu grande importância à construção de um ecossistema de código aberto. Atualmente, o Apache APISIX possui mais de 10 plug-ins relacionados a autenticação e autorização que suportam integração com os principais serviços de autenticação e autorização do setor.
Se você tiver a necessidade de integrar com outros provedores de autenticação, visite o GitHub do Apache APISIX e deixe suas sugestões via issue; ou assine a lista de e-mails do Apache APISIX para expressar seus pensamentos por e-mail.