-
Trate o cliente móvel como não confiável: Assuma que os atacantes podem extrair valores empacotados, interceptar APIs nativas e reproduzir tokens de dispositivos comprometidos - projete sessões que limitem o raio de explosão com TTL de acesso curto e rotação de atualização.
-
Nunca armazene tokens de atualização no AsyncStorage: SQLite sem criptografia é trivialmente legível em dispositivos com root - use expo-secure-store com WHEN_UNLOCKED_THIS_DEVICE_ONLY (OWASP M2: Armazenamento Inseguro de Dados).
-
Mantenha os tokens de acesso de curta duração: TTL de token de acesso de 5 a 15 minutos limita os danos por interceptação - atualize proativamente antes da expiração, não apenas após 401 (OWASP M4: Autenticação Insegura).
-
Rotacione tokens de atualização a cada troca: Emita um novo token de atualização e invalide o anterior - detecte o reuso como um sinal de violação e revogue toda a família de tokens (OWASP M4).
-
Implemente logout em todos os lugares: O logout local é insuficiente para dispositivos roubados - exponha a revogação de atualização do lado do servidor que invalida todas as sessões do usuário (OWASP M4).
-
Limpe SecureStore, cache de Query e navegação no logout: deleteItemAsync para todas as chaves de autenticação, queryClient.clear() e router.replace para fazer login - o botão voltar do Android não deve revelar telas autenticadas (OWASP M2).
-
Use Código de Autorização + PKCE para OAuth: Mobile é um cliente público - nunca use fluxo implícito (response_type=token) ou WebViews incorporadas; use expo-auth-session com usePKCE: true (OWASP M4).
-
Troque códigos OAuth no seu backend quando houver segredos: Segredos do cliente não pertencem ao pacote do aplicativo - envie code + code_verifier para seu servidor para troca de token (OWASP M1: Uso Inadequado da Plataforma).
-
Registre URIs de redirecionamento por sabor de build: A saída de makeRedirectUri() deve corresponder aos consoles do Google, Apple e IdP para desenvolvimento, pré-visualização e produção - redirect_uri_mismatch é a principal falha de integração OAuth.
-
Nunca coloque segredos de cliente OAuth em EXPO_PUBLIC_*: Variáveis de ambiente públicas são incorporadas ao pacote Hermes - audite com npx expo config --type public antes de cada lançamento (OWASP M2).
-
Anexe tokens via Authorization: Bearer - não via parâmetros de query da URL: Strings de query aparecem em logs, analytics e cabeçalhos referenciadores - cabeçalhos apenas para tokens de acesso (OWASP M3: Comunicação Insegura).
-
Use HTTPS para todos os endpoints de autenticação e API: Sem exceções de texto claro em produção - o TLS do sistema no SDK 57 é o padrão; o pinning de certificado requer um ADR (OWASP M3).
-
Uma única tentativa de retentativa de 401 com atualização deduplicada: Uma promessa de atualização em andamento para 401s paralelos - loops de retentativa infinitos mascaram má configuração e sobrecarregam o servidor de autenticação (OWASP M4).
-
Diferencie sessões offline de revogadas: Falhas de rede durante a atualização não devem forçar o logout - session_expired_offline vs session_expired evita raiva de logout em modo avião (OWASP M7: Qualidade do Código do Cliente).
-
Atualização proativa ao retornar ao primeiro plano: O listener AppState atualiza quando shouldRefresh(session) após o background - os usuários não devem ver prompts de login a cada hora (OWASP M4).
-
Aplique buffer de dessincronização de relógio à expiração do cliente: Atualize 30–120 segundos antes de expiresAt do cliente - prefira serverTime do servidor em respostas de atualização em vez do relógio do dispositivo sozinho (OWASP M5: Criptografia Insuficiente).
-
Biometria prova presença - não identidade para o servidor: Use expo-local-authentication para UX de escalonamento; endpoints de alto risco ainda precisam de MFA do servidor ou tokens de escalonamento (OWASP M4).
-
Ofereça fallback de senha para fluxos biométricos: disableDeviceFallback: false - prender usuários sem biometria registrada falha na acessibilidade e nas expectativas de revisão da App Store (OWASP M1).
-
Nomes de chaves SecureStore por conta: Aplicativos com várias contas usam auth.refresh_token.{accountId} - a troca de conta limpa TanStack Query e Zustand antes do bootstrap (OWASP M2 / M6).
-
Vincule tokens de atualização ao ID do dispositivo no lado do servidor: Envie deviceId estável no login e na atualização - o servidor rejeita dispositivos desconhecidos; os usuários podem revogar dispositivos perdidos nas configurações (OWASP M4).
-
Inclua userId nas chaves de cache do TanStack Query: Evita o flash de dados entre contas durante a troca, mesmo se a limpeza ocorrer em paralelo - queryKey: ['orders', userId] (OWASP M6: Autorização Insegura).
-
Nunca confie em claims JWT do lado do cliente para autorização: Decodifique claims apenas para exibição - o servidor valida roles e scopes em cada requisição (OWASP M6).
-
Limpe tokens de logs e relatórios de crash: Redija cabeçalhos Authorization em breadcrumbs do Sentry e logging estruturado - tokens em dumps de crash são uma descoberta comum em auditorias (OWASP M2).
-
Degrade graciosamente em sinais de jailbreak/root: Ações de alto risco (pagamentos, exportação de PII) justificam bloqueios ou MFA - não bloqueie aplicativos inteiros permanentemente em sinais que podem ser falsificados sem aprovação do produto/legal (OWASP M8: Adulteração de Código).
-
Teste a autenticação em builds de desenvolvimento - não apenas no Expo Go: URIs de redirecionamento OAuth, grupos de acesso do Keychain e entitlements do Apple Sign In diferem do Expo Go - testes E2E de autenticação rodam contra IDs de bundle reais antes da submissão para a loja (OWASP M9: Engenharia Reversa).
Versões da Stack: Esta página foi escrita para React 19.2.3, React Native 0.86.0 e Expo SDK 57 (expo ~57.0.4).