Login por QR-code
Tela alternativa de login: em vez de digitar e-mail e senha, a pessoa escaneia um QR-code com o aplicativo móvel do Mobilemed (já autenticado nele) para entrar na versão web.

Antes de começar
- Rota:
/:tenant/authorization/qr. - Componente:
QrcodeLoginComponent(@pages/authentication/qrcode-login). - É preciso ter o aplicativo móvel do Mobilemed instalado e já logado nele — quem aprova o QR-code é o app, não a web.
Permissões e acesso
Pública na web — qualquer pessoa não autenticada pode abrir a tela e ver o QR-code (o desafio de QR-code em si é público para ser iniciado). A aprovação, feita no aplicativo, exige que o app já tenha uma sessão mobile ativa.
Caminho principal
- A pessoa clica em Entrar com QRCode na tela de Login, ou acessa a rota diretamente.
- A tela pede um novo desafio de QR-code à API e desenha a imagem do QR assim que a resposta chega.
- A pessoa abre o aplicativo móvel (já logado) e escaneia o QR-code.
- Enquanto isso, a tela web consulta a API em segundo plano (a cada 750 ms) perguntando se o desafio já foi aprovado.
- Quando o aplicativo aprova o desafio, a sessão web é criada automaticamente e a pessoa é levada para a área logada — sem precisar clicar em nada na web.
Este levantamento confirmou apenas a geração real do QR-code (chamada real à API, imagem
desenhada na tela). Concluir o login exige um segundo dispositivo com o aplicativo móvel
autenticado, o que está fora do escopo deste levantamento (cobre só o frontend web).
A confirmar — responsável: time de frontend/mobile; data: 24/09/2026.: captura do fluxo completo
(aprovação pelo app) e do estado de erro (hasError, com o botão Tentar novamente).
Estados e mensagens
| Estado | Quando aparece | |
|---|---|---|
| QR-code exibido | Desafio criado com sucesso | ![]() |
| Aguardando | Entre a criação do desafio e o QR-code aparecer | Texto "Aguardando redirecionamento..." (não capturado isoladamente — a transição é rápida) |
| Erro / QR-code indisponível | Falha ao iniciar o desafio, ou ele expira sem ser aprovado | Mensagem de erro + botão Tentar novamente (não reproduzido nesta rodada) |
Validações e falhas de backend
| Situação | Onde é validada | Comportamento | Como se recupera |
|---|---|---|---|
Client OAuth inválido, redirect_uri ou escopo não permitidos | POST /sessions/qr-challenges | 400 IDENTITY_QR_CHALLENGE_UNAVAILABLE | A tela mostra o estado de erro com o botão Tentar novamente |
| Desafio expirado, ainda pendente, ou já usado ao concluir | POST /sessions/qr-challenges/complete (chamado em polling) | 400 — tratado pela tela como "ainda pendente" e repetido automaticamente | Nenhuma ação da pessoa; só se aplica erro real quando o desafio expira de vez |
Regras de negócio
| ID | Regra | O que a tela reflete |
|---|---|---|
| RN-01 | O desafio de QR-code nunca expõe tokens de sessão | O QR-code carrega só um token opaco de posse; quem materializa a sessão web é o app, ao aprovar |
| RN-02 | Quem cria a sessão de navegador é o aplicativo aprovador | A sessão web nasce com o IP/user-agent do desafio, não do aplicativo |
| RN-03 | Conclusão é de uso único | Depois de concluído, o mesmo desafio não pode ser usado de novo (fica consumed) |
Informações técnicas
Rota da tela: /:tenant/authorization/qr · Acesso: Público (criação e consulta do
desafio); a aprovação exige sessão mobile ativa no app
Rotas de API consumidas:
| Método | Rota | Quando é chamada |
|---|---|---|
| POST | /v1/sessions/qr-challenges | Ao abrir a tela (gera o desafio) |
| POST | /v1/sessions/qr-challenges/complete | Em polling, a cada 750 ms, até ser aprovado |
→ Detalhe da rota: Login por QR-code — API
Relacionado
- ⚙️ API: Login por QR-code — API
- 🔑 Voltar: Login
- 📂 Módulo (back): Authentication — visão geral