Logto x Hasura: Usar JWT para controlo de acesso
Este guia abrangente descreve os passos envolvidos na integração do Logto com o modo de controlo de acesso JWT da Hasura, fortalecendo efetivamente a segurança dos dados.
Hasura é uma ferramenta que pode fornecer rapidamente APIs GraphQL e REST correspondentes aos teus dados. Considerando a segurança dos dados, a Hasura também oferece a capacidade de ajustar o controlo de acesso para cada API diferente.
Normalmente, os utilizadores da Hasura utilizam outros serviços de gestão de identidade e autenticação, sendo o Logto um deles muito popular.
Neste post de blog, iremos assumir que já estás a usar serviços da Hasura. Vamos introduzir como integrar a Hasura e o Logto para maximizar a segurança dos teus dados. Se não tens uma conta Logto, inscreve-te e começa a utilizá-la agora!
Contexto
A Hasura utiliza a gestão de acesso baseada em papéis, enquanto o Logto utiliza o padrão controlo de acesso baseado em papéis (RBAC).
No modelo e nas melhores práticas do RBAC do Logto, aconselhamos os utilizadores a usarem scope
para corresponder à granularidade mais fina de permissões, usarem role
como um conjunto de scope
s para operações em lote convenientes e, por fim, verificarem scope
(geralmente no lado dos fornecedores de recursos) para confirmar se um utilizador pode realizar uma operação específica.
Na Hasura, um role
corresponde à granularidade mais fina de permissões, e as verificações de permissões são feitas contra os role
s. Portanto, durante a configuração do Logto, recomendamos mapear um role
a um scope
exato. Esta abordagem pode ligar as permissões do Logto e da Hasura para evitar confusões e usos indevidos.
A Hasura pode suportar controlo de acesso usando Webhooks ou JWT. O nosso post de blog anterior introduziu como usar Webhooks, e nas secções seguintes, iremos explicar como utilizar o controlo de acesso em modo JWT da Hasura.
Começar
Vamos começar com um exemplo simples. Suponhamos que um utilizador já tenha duas APIs na Hasura, GET /user
e PATCH /user
, correspondentes a dois papéis: user:reader
e user:maintainer
, respetivamente.
1. Criar recurso API Hasura no Logto
Cria um recurso API Hasura no Logto.
2. Criar papéis de acordo com a configuração da Hasura no Logto
Precisamos de criar dois scope
s para o recurso API Hasura mencionado no passo 1, nomeadamente read:user
e maintain:user
, e depois criar dois papéis: user:reader
(contendo o read:user
scope) e user:maintainer
(incluindo o maintain:user
scope) para corresponder um-a-um com os papéis da Hasura. E atribuir estes papéis aos utilizadores do Logto conforme necessário.
3. Configurar a variável de ambiente HASURA_GRAPHQL_JWT_SECRET
da Hasura para ativar o modo JWT
Ao olhar para as opções de configuração JWT da Hasura, precisamos adicionar e configurar a variável de ambiente HASURA_GRAPHQL_JWT_SECRET
antes de podermos usar JWT para controlo de acesso.
Existem muitas opções diferentes que podem ser configuradas, mas aqui introduzimos o caso mais simples: apenas o jwk_url
precisa ser configurado. Esse valor pode ser obtido do endpoint de configuração OpenID do teu Logto (https://your.logto.domain/oidc/.well-known/openid-configuration).
4. Personalizar reivindicações extra do token de acesso do utilizador
Usando a funcionalidade de JWT personalizado do Logto, personaliza a lógica para adicionar reivindicações extras ao token de acesso do utilizador no formato JWT.
Personaliza o método getCustomJwtClaims
para adicionar dados no JWT dos quais a Hasura depende para implementar controlo de acesso. Isso pode incluir dados relacionados ao utilizador a ser autorizado durante essa instância, incluindo os role
s que ele possui, que podem ser acessados através do context
.
Também definimos uma variável de ambiente USER_DEFAULT_ROLE_NAMES
para evitar codificação rígida.
5. Integrar SDK Logto
Depois de configurar o Logto e a Hasura, integra a tua aplicação com o SDK do Logto. Aqui usamos um exemplo em Next para pré-visualizar o token de acesso do utilizador emitido pelo Logto após o login do utilizador.
Primeiro, atribuímos os papéis user:reader
e user:maintainer
criados anteriormente ao utilizador, e depois fazemos o login como esse utilizador.
Obter o token de acesso do utilizador e solicitar APIs da Hasura:
Conclusão
Neste artigo, fornecemos outro método de controlo de acesso baseado em JWT suportado pela Hasura, além de Webhook.
Comparando os processos de controlo de acesso da Hasura via Webhook e JWT, podemos ver que a abordagem via Webhook envia um Webhook para o Logto e aguarda uma resposta com cada pedido da Hasura; enquanto a abordagem baseada em JWT pode ser usada continuamente até o JWT expirar.
A abordagem JWT pode reduzir a carga na rede e eliminar a latência de rede trazida pelos Webhooks; enquanto isso, a abordagem via Webhook pode sincronizar mudanças nas permissões do utilizador em tempo real.
Os utilizadores podem escolher a abordagem mais adequada com base nestas conclusões, combinada com as suas necessidades reais de negócio.