sequenceDiagram
participant U as Usuário (Desktop)
participant SDK as App React + SDK
participant VS as INJI Verify Service
participant W as Carteira Digital (Celular)
U->>SDK: Clica "Verificar Idade"
SDK->>VS: POST /v1/verify/vp-request
VS-->>SDK: transactionId + requestId + authorizationDetails
SDK->>U: Exibe QR Code (authorizationDetails)
U->>W: Escaneia QR Code com a Carteira
W->>VS: Apresenta credencial (VP submission)
VS->>VS: Valida credencial + policy 18+
Note over SDK,VS: SDK faz long-polling em /vp-request/{id}/status
VS-->>SDK: Resultado da verificação
SDK->>U: "Idade verificada!" (callback)
Fluxo de Verificação (Visão Geral)
Objetivo
Entender o ciclo completo de uma verificação de idade, do início ao resultado.
Fluxo Same-Device via Deep Link

Fluxo Ponta a Ponta (Cross-Device — QR Code)
Fluxo Same-Device (Deep Link — Mobile)
sequenceDiagram
participant U as Usuário (Celular)
participant SDK as App React + SDK
participant VS as INJI Verify Service
participant W as Carteira Digital
U->>SDK: Toca "Verificar Idade"
SDK->>VS: POST /v1/verify/vp-request
VS-->>SDK: transactionId + requestId + authorizationDetails
SDK->>W: Abre Deep Link (openid4vp://...)
W->>VS: Apresenta credencial (VP submission)
Note over W: Usuário volta ao app
SDK->>VS: Long-polling /vp-request/{id}/status
VS-->>SDK: Resultado da verificação
SDK->>U: "Idade verificada!" (callback)
O que o SDK faz internamente
O INJI Verify SDK gerencia todo o ciclo:
- Cria a VP Request — chama
POST /v1/verify/vp-requestcom a Presentation Definition - Detecta o dispositivo — se mobile (com
isSameDeviceFlowEnabled: true), usa Deep Link; se desktop, renderiza QR Code - Long-polling — consulta
GET /v1/verify/vp-request/{id}/statusrepetidamente até receber o resultado ou expirar (timeout padrão: 55s) - Busca resultado — quando a Wallet envia a credencial, obtém o resultado via
GET /v1/verify/vp-result/{id} - Dispara callback — chama
onVPProcessed(results)ouonError()em caso de falha
Você não precisa implementar nenhuma dessas etapas manualmente.
Estados da Verificação
| Estado | Significado |
|---|---|
| VP Request criada | Aguardando apresentação da credencial |
| VP submetida | Carteira enviou a credencial ao Service |
SUCCESS |
Credencial válida e policy satisfeita |
INVALID |
Credencial inválida (assinatura, emissor, formato) |
EXPIRED |
Credencial ou sessão expirada |
Callbacks do SDK
O SDK oferece quatro callbacks para gerenciar o fluxo:
onVPProcessed(results)
Retorna o resultado completo diretamente no frontend.
<OpenID4VPVerification
// ...
onVPProcessed={(results) => {
const ok = results.some(r => r.vcStatus === 'SUCCESS');
console.log('Verificado:', ok);
}}
/>
onError(error) — Tratamento de erros
Chamado quando ocorre um erro na verificação.
<OpenID4VPVerification
// ...
onError={(error) => {
console.error('Erro na verificação:', error);
}}
/>
onQrCodeExpired() — QR Code expirado
Chamado quando o QR Code expira (apenas em fluxo cross-device).
<OpenID4VPVerification
// ...
onQrCodeExpired={() => {
console.log('QR Code expirou');
// Resetar UI ou permitir nova tentativa
}}
/>
Aviso
onVPProcessed expõe o resultado diretamente no frontend. Para maior segurança em produção, valide o resultado no backend usando o transactionId.
Propriedades principais do componente
| Propriedade | Tipo | Descrição |
|---|---|---|
verifyServiceUrl |
string | URL base do INJI Verify Service |
clientId |
string | DID do cliente (ex: did:web:localhost:v1:verify) |
protocol |
string | Protocolo OpenID4VP (ex: openid4vp://) |
isSameDeviceFlowEnabled |
boolean | Se true, usa Deep Link; se false, renderiza QR Code |
presentationDefinition |
object | Define quais credenciais são aceitas |
onVPProcessed |
function | Callback com resultado completo |
onError |
function | Callback para erros |
onQrCodeExpired |
function | Callback quando QR Code expira |
Próximo passo
Escolha sua jornada: