Implementação de Login Silencioso em Mini Programas WeChat

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

  1. O mini programa chama wx.login() para obter o código temporário.
  2. O código é enviado ao servidor, que o troca por identificadores e chave de sessão via API do WeChat.
  3. 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_key e, se necessário, descriptografar dados sensíveis (como OpenID).
  • Atualizações recentes do WeChat exigem o uso de wx.getUserProfile para 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.login em 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, renovarLogin e verificarSessao.
  • 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:

  1. Na inicialização do mini programa: Ideal para garantir autenticação antecipada, mas pode conflitar com o ciclo de vida assíncrono.
  2. 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.

Tags: WeChat Mini Programs Login Silencioso OpenID UnionID session_key

Publicado em 7-1 06:00