Introdução
No desenvolvimento de mini programas WeChat, identificar usuários de forma eficiente é crucial. O WeChat oferece dois identificadores principais:
- OpenID: Identifica um usuário dentro de um mini programa ou conta oficial específica.
- UnionID: Permite vincular usuários em múltiplos mini programas, contas oficiais ou aplicativos sob a mesma entidade registrada na Plataforma Aberta WeChat.
Anteriormente, desenvolvedores frequentemente utilizavam a interface wx.getUserInfo para obter informações do usuário no início do mini programa, o que gerava problemas como solicitações de autorização invasivas e abandono de usuários. Atualizações do WeChat incentivam o uso de wx.login para obter dados básicos de forma silenciosa, solicitando informações detalhadas (como perfil) apenas quando necessário.
Conceito de Login Silencioso
O login silencioso refere-se ao processo de autenticação que ocorre sem interação do usuário, utilizando wx.login para obter um código temporário. Esse código é enviado ao servidor do desenvolvedor, que o troca por OpenID e UnionID (quando aplicável), além de uma chave de sessão (session_key). O servidor então gera um token de autenticação personalizado (por exemplo, auth-token), que é armazenado localmante para identificação nas requisições subsequentes.
Fluxo do Login Silencioso
- O mini programa chama
wx.login()para obter o código temporário. - O código é enviado ao servidor, que o troca por identificadores e chave de sessão via API do WeChat.
- O servidor gera e retorna um token de autenticação personalizado.
Implementação do Código
Abaixo está um exemplo de função para login silencioso, com nomes de variáveis e lógica reestruturada:
private async realizarLoginSilencioso(): Promise<void> {
try {
this.estado.loginSilencioso.emProgresso();
const codigoTemporario = await obterCodigoAutenticacaoWeChat();
const respostaServidor = await servicoAutenticacao.autenticar(codigoTemporario);
localStorage.setItem('token_sessao', respostaServidor.token);
this.estado.loginSilencioso.sucesso();
} catch (erro) {
registrarErro('Falha no login silencioso', erro);
this.estado.loginSilencioso.falha(erro);
throw erro;
}
}
Validação e Descriptografia de Dados
Após o login silencioso, o WeChat fornece uma session_key no servidor. Para garantir a segurança dos dados:
- Ao obter informações do usuário (como perfil), o WeChat retorna dados criptografados e uma assinatura.
- O servidor deve validar a assinatura usendo
session_keye, se necessário, descriptografar dados sensíveis (comoOpenID). - Atualizações recentes do WeChat exigem o uso de
wx.getUserProfilepara obter informações detalhadas, com consentimento explícito do usuário.
Gerenciamento de Chave de Sessão
A session_key tem validade variável e pode ser invalidada em situações como:
- Chamadas repetidas a
wx.loginem curto intervalo. - Inatividade prolongada do usuário.
Recomenda-se usar wx.checkSession para verificar a validade, mas note que essa API não é 100% confiável. Implemente tratamento de erros no servidor para session_key expirado.
Arquitetura do Sistema de Login
Divida a lógica em camadas:
- Camada de serviço: Encapsula métodos como
loginSilencioso,renovarLogineverificarSessao. - Camada de aplicação: Utiliza os serviços para funcionalidades específicas.
Métodos Principais
| Método | Descrição | Cenário de Uso |
|---|---|---|
loginSilencioso |
Executa o login silencioso completo. | Inicialização do mini programa. |
renovarLogin |
Renova o token de autenticação. | Ao detectar sessão expirada. |
verificarSessao |
Valida a session_key com wx.checkSession. |
Antes de operações críticas. |
Momentos de Chamada do Login Silencioso
Inicie o login silencioso:
- Na inicialização do mini programa: Ideal para garantir autenticação antecipada, mas pode conflitar com o ciclo de vida assíncrono.
- Durante requisições HTTP: Interceptar chamadas para verificar e renovar a sessão, usando mecanismos como:
- Fila única para requisições concorrentes.
- Mecanismo de fusível para evitar sobrecarga.
Exemplo de Fila Única e Fusível
Para evitar múltiplas chamadas simultâneas de renovarLogin:
const filaUnica = require('fila-unica');
const fusivel = require('fusivel');
class ServicoAutenticacao {
@filaUnica({ nome: 'renovar_login' })
@fusivel({ tentativas: 3, tempoRestauracao: 5000 })
async renovarLogin(): Promise<void> {
try {
await this.realizarLoginSilencioso();
} catch (erro) {
throw erro;
}
}
}
O mecanismo de fusível interrompe chamadas excessivas, reiniciando após um período de resfriamento.
Considerações Finais
O login silencioso é essencial para uma experiência de usuário não intrusiva em mini programas WeChat. Implemente tratamento robusto de erros e concorrência para garantir estabilidade.