Adicionar autenticação ao seu aplicativo Capacitor JS
- A demonstração a seguir é baseada no Capacitor JS 5.0.6.
Pré-requisitos
- Uma conta Logto Cloud ou um Logto auto-hospedado.
- Um aplicativo nativo Logto criado.
Instalação
Instale o Logto SDK e as dependências pares através do seu gerenciador de pacotes favorito:
- npm
- Yarn
- pnpm
npm i @logto/capacitor
npm i @capacitor/browser @capacitor/app @capacitor/preferences
yarn add @logto/capacitor
yarn add @capacitor/browser @capacitor/app @capacitor/preferences
pnpm add @logto/capacitor
pnpm add @capacitor/browser @capacitor/app @capacitor/preferences
O pacote @logto/capacitor
é o SDK para Logto. Os pacotes restantes são suas dependências pares.
Integração
Iniciar cliente Logto
Adicione o seguinte código ao seu projeto Capacitor:
import LogtoClient, { type LogtoConfig } from '@logto/capacitor';
const logtoConfig: LogtoConfig = {
endpoint: '<your-logto-endpoint>',
appId: '<your-application-id>',
};
const logtoClient = new LogtoClient(config);
Implementar login
Antes de mergulharmos nos detalhes, aqui está uma visão geral rápida da experiência do usuário final. O processo de login pode ser simplificado da seguinte forma:
- Seu aplicativo invoca o método de login.
- O usuário é redirecionado para a página de login do Logto. Para aplicativos nativos, o navegador do sistema é aberto.
- O usuário faz login e é redirecionado de volta para o seu aplicativo (configurado como o URI de redirecionamento).
Sobre o login baseado em redirecionamento
- Este processo de autenticação segue o protocolo OpenID Connect (OIDC), e o Logto aplica medidas de segurança rigorosas para proteger o login do usuário.
- Se você tiver vários aplicativos, pode usar o mesmo provedor de identidade (Logto). Uma vez que o usuário faz login em um aplicativo, o Logto completará automaticamente o processo de login quando o usuário acessar outro aplicativo.
Para saber mais sobre a lógica e os benefícios do login baseado em redirecionamento, veja Experiência de login do Logto explicada.
Agora, vamos configurar o URI de redirecionamento. O URI de redirecionamento é usado para redirecionar o usuário de volta ao seu aplicativo após o fluxo de autenticação.
Certifique-se de que o URI redirecione para o aplicativo Capacitor, por exemplo, com.example.app://callback
. O valor pode variar dependendo da configuração do seu aplicativo Capacitor. Para mais detalhes, veja Capacitor Deep Links.
Em seguida, adicione o seguinte código ao manipulador onClick do botão de login:
const onClick = async () => {
await logtoClient.signIn('com.example.app://callback');
console.log(await logtoClient.isAuthenticated()); // true
console.log(await logtoClient.getIdTokenClaims()); // { sub: '...', ... }
};
Implementar logout
Como o Capacitor utiliza o Safari View Controller no iOS e Chrome Custom Tabs no Android, o estado de autenticação pode ser mantido por um tempo. No entanto, às vezes o usuário pode querer sair do aplicativo imediatamente. Nesse caso, podemos usar o método signOut
para desconectar o usuário:
const onClick = async () => {
await logtoClient.signOut();
console.log(await logtoClient.isAuthenticated()); // false
};
O método signOut
tem um parâmetro opcional para o URI de redirecionamento pós-logout. Se não for fornecido, o usuário será redirecionado para a página de logout do Logto.
O usuário precisa clicar em "Concluído" para fechar a visualização da web e retornar ao aplicativo Capacitor. Se você quiser redirecionar automaticamente o usuário de volta ao aplicativo Capacitor, pode fornecer o URI de redirecionamento pós-logout, por exemplo, com.example.app://callback/sign-out
.
Certifique-se de que o URI de redirecionamento pós-logout possa redirecionar para o aplicativo Capacitor. Em seguida, adicione o seguinte código ao manipulador onClick do botão de logout:
const onClick = async () => {
await logtoClient.signOut('com.example.app://callback/sign-out');
};
Ponto de verificação: Disparar o fluxo de autenticação
Execute o aplicativo Capacitor e clique no botão de login. Uma janela do navegador será aberta, redirecionando para a página de login do Logto.
Se o usuário fechar a janela do navegador sem completar o fluxo de autenticação, o aplicativo Capacitor receberá um LogtoClientError
.
Obter informações do usuário
Exibir informações do usuário
Para exibir as informações do usuário, você pode usar o método getIdTokenClaims()
. Por exemplo, em um aplicativo Capacitor:
const userClaims = await logtoClient.getIdTokenClaims();
console.log(userClaims);
Solicitar reivindicações adicionais
Você pode perceber que algumas informações do usuário estão faltando no objeto retornado de client.getIdTokenClaims()
. Isso ocorre porque OAuth 2.0 e OpenID Connect (OIDC) são projetados para seguir o princípio do menor privilégio (PoLP), e o Logto é construído com base nesses padrões.
Por padrão, reivindicações limitadas são retornadas. Se você precisar de mais informações, pode solicitar escopos adicionais para acessar mais reivindicações.
Uma "reivindicação (Claim)" é uma afirmação feita sobre um sujeito; um "escopo (Scope)" é um grupo de reivindicações. No caso atual, uma reivindicação é uma informação sobre o usuário.
Aqui está um exemplo não normativo da relação escopo - reivindicação:
A reivindicação "sub" significa "sujeito (Subject)", que é o identificador único do usuário (ou seja, ID do usuário).
O Logto SDK sempre solicitará três escopos: openid
, profile
e offline_access
.
Para solicitar escopos adicionais, você pode passá-los para o objeto LogtoConfig
ao inicializar o cliente. Por exemplo:
const logtoConfig = {
scopes: ['email', 'phone', 'custom_data', 'organizations'],
};
Então você pode acessar as reivindicações adicionais no valor de retorno de client.getIdTokenClaims()
:
Reivindicações que precisam de solicitações de rede
Para evitar o inchaço do Token de ID (ID token), algumas reivindicações requerem solicitações de rede para serem buscadas. Por exemplo, a reivindicação custom_data
não está incluída no objeto do usuário, mesmo que seja solicitada nos escopos. Para acessar essas reivindicações, você pode usar o método client.fetchUserInfo()
:
const userInfo = await logtoClient.fetchUserInfo();
console.log(userInfo);
Escopos e reivindicações
Logto usa as convenções de escopos e reivindicações do OIDC para definir os escopos e reivindicações para recuperar informações do usuário do Token de ID e do endpoint userinfo do OIDC. Tanto "escopo" quanto "reivindicação" são termos das especificações OAuth 2.0 e OpenID Connect (OIDC).
Em resumo, quando você solicita um escopo, você obterá as reivindicações correspondentes nas informações do usuário. Por exemplo, se você solicitar o escopo `email`, você obterá os dados `email` e `email_verified` do usuário.
Por padrão, o Logto SDK sempre solicitará três escopos: `openid`, `profile` e `offline_access`, e não há como remover esses escopos padrão. Mas você pode adicionar mais escopos ao configurar o Logto:
import { type LogtoConfig, UserScope } from '@logto/capacitor';
const config: LogtoConfig = {
// ...other options
scopes: [UserScope.Email, UserScope.Phone], // Adicione os escopos que você precisa
};