APISIX
Atualmente, existem 2 métodos para usar o Casdoor para se conectar ao APISIX via plugins do APISIX e proteger as APIs por trás do APISIX: usando o plugin Casdoor do APISIX ou usando o plugin OIDC do APISIX.
Conecte o Casdoor via plugin Casdoor do APISIX
Este plugin, authz-casdoor
, pode proteger APIs por trás do APISIX, forçando cada solicitação a ser autenticada sem modificar o código da API.
Como habilitá-lo
Você precisa especificar este plugin ao criar a rota e fornecer todos os campos necessários. Aqui está um exemplo.
curl "http://127.0.0.1:9180/apisix/admin/routes/1" -H "X-API-KEY: edd1c9f034335f136f87ad84b625c8f1" -X PUT -d '
{
"methods": ["GET"],
"uri": "/anything/*",
"plugins": {
"authz-casdoor": {
"endpoint_addr":"http://localhost:8000",
"callback_url":"http://localhost:9080/anything/callback",
"client_id":"7ceb9b7fda4a9061ec1c",
"client_secret":"3416238e1edf915eac08b8fe345b2b95cdba7e04"
}
},
"upstream": {
"type": "roundrobin",
"nodes": {
"httpbin.org:80": 1
}
}
}'
Neste exemplo, criamos uma rota "/anything/*" apontada para "httpbin.org:80" usando a API de administração do APISIX, com o plugin "authz-casdoor" habilitado. Esta rota agora está sob a proteção de autenticação do Casdoor.
Atributos
Nome | Tipo | Requisito | Padrão | Válido | Descrição |
---|---|---|---|---|---|
endpoint_addr | string | obrigatório | A URL do Casdoor. | ||
client_id | string | obrigatório | O ID do cliente no Casdoor. | ||
client_secret | string | obrigatório | O segredo do cliente no Casdoor. | ||
callback_url | string | obrigatório | A URL de retorno que é usada para receber o estado e o código. |
endpoint_addr e callback_url não devem terminar com '/'
Na configuração do plugin "authz-casdoor", podemos ver quatro parâmetros.
O primeiro é "callback_url". Esta é a URL de retorno no OAuth2. Deve ser enfatizado que esta URL de retorno deve pertencer à "uri" que você especificou para a rota. Por exemplo, neste exemplo, http://localhost:9080/anything/callback obviamente pertence a "/anything/*". Somente desta forma, a visita à callback_url pode ser interceptada e utilizada pelo plugin (para que o plugin possa obter o código e o estado no OAuth2). A lógica da callback_url é implementada completamente pelo plugin, então não há necessidade de modificar o servidor para implementar este retorno.
O segundo parâmetro "endpoint_addr" é obviamente a URL do Casdoor. O terceiro e quarto parâmetros são "client_id" e "client_secret", que você pode obter do Casdoor ao registrar um aplicativo.
Como funciona?
Suponha que um novo usuário que nunca visitou esta rota antes vai visitá-la (http://localhost:9080/anything/d?param1=foo¶m2=bar). Considerando que "authz-casdoor" está habilitado, esta visita seria processada primeiro pelo plugin "authz-casdoor". Após verificar a sessão e confirmar que este usuário não foi autenticado, a visita será interceptada. Com a URL original que o usuário deseja visitar mantida, ele será redirecionado para a página de login do Casdoor.
Após fazer login com sucesso com um nome de usuário e senha (ou qualquer método que use), o Casdoor redirecionará este usuário para a "callback_url" com os parâmetros GET "code" e "state" especificados. Como a "callback_url" é conhecida pelo plugin, quando a visita à "callback_url" for interceptada desta vez, a lógica do "Authorization code Grant Flow" no OAuth2 será acionada. Isso significa que o plugin solicitará o token de acesso para confirmar se este usuário realmente fez login. Após essa confirmação, o plugin redirecionará este usuário para a URL original que ele deseja visitar, que foi mantida por nós anteriormente. O status de login também será mantido na sessão.
Na próxima vez que este usuário quiser visitar a URL por trás desta rota (por exemplo, http://localhost:9080/anything/d), após descobrir que este usuário foi autenticado anteriormente, este plugin não redirecionará mais este usuário. Desta forma, o usuário pode visitar o que quiser sob esta rota sem ser interferido.
Conecte o Casdoor via plugin OIDC do APISIX
O Casdoor pode usar o protocolo OIDC para se conectar ao APISIX, e este documento mostrará como fazer isso.
A seguir estão alguns dos nomes usados na configuração:
CASDOOR_HOSTNAME
: Nome de domínio ou IP onde o servidor Casdoor está implantado.
APISIX_HOSTNAME
: Nome de domínio ou IP onde o APISIX está implantado.
Etapa 1: Implante o Casdoor e o APISIX
Primeiramente, implante o Casdoor e o APISIX.
Após uma implantação bem-sucedida, você precisa garantir:
- O Casdoor pode ser acessado e usado normalmente.
- Defina o valor de
origin
do Casdoor (conf/app.conf) paraCASDOOR_HOSTNAME
.
Etapa 2: Configurar aplicativo Casdoor
- Crie um novo aplicativo Casdoor ou use um existente.
- Adicione uma URL de redirecionamento:
http://APISIX_HOSTNAME/REDIRECTWHATYOUWANT
, e substituaREDIRECTWHATYOUWANT
pela URL de redirecionamento desejada. - Selecione "JWT-Empty" para a opção de formato de Token.
- Adicione o provedor desejado e configure outras configurações.
Na página de configurações do aplicativo, você encontrará os valores de Client ID
e Client Secret
como mostrado na imagem acima. Usaremos eles na próxima etapa.
Abra seu navegador favorito e visite: http://CASDOOR_HOSTNAME
/.well-known/openid-configuration, onde você encontrará a configuração OIDC do Casdoor.
Etapa 3: Configurar APISIX
O APISIX tem suporte oficial para OIDC, que é implementado usando lua-resty-openidc.
Você pode personalizar as configurações de acordo com a documentação OIDC do APISIX. As seguintes configurações de roteamento serão usadas:
# Use your own X-Api-Key
$ curl -X POST APISIX_HOSTNAME/apisix/admin/routes -H "X-Api-Key: edd1c9f034335f136f87ad84b625c8f1" -d '{
"uri": "/get",
"name": "apisix_casdoor_test",
"plugins": {
"openid-connect": {
"client_id": "Client ID",
"client_secret": "Client Secret",
"discovery": "http://CASDOOR_HOSTNAME/.well-known/openid-configuration",
"introspection_endpoint_auth_method": "client_secret_basic",
"logout_path": "/logout",
"realm": "master",
"redirect_uri": "http://APISIX_HOSTNAME/REDIRECTWHATYOUWANT",
"bearer_only": false,
"set_id_token_header": false,
"access_token_in_authorization_header": true,
"set_access_token_header": true,
"set_userinfo_header": false,
"realm": "master"
}
},
"upstream": {
"type": "roundrobin",
"nodes": {
"httpbin.org:80": 1
}
}
}'
Agora, visite http://APISIX_HOSTNAME/get
, e o navegador irá redirecioná-lo para a página de login do Casdoor. Após fazer login com sucesso, você verá que uma solicitação foi enviada para httpbin.org como mostrado na captura de tela abaixo.