Integre em 1 Hora
Objetivo
Sair do zero até uma verificação de idade funcionando em ambiente de desenvolvimento.
Checklist
| # | Etapa | Tempo | Resultado esperado |
|---|---|---|---|
| 1 | Preparar VM com Docker | 10 min | docker compose version funciona |
| 2 | Subir INJI Verify Service | 10 min | Health check retorna UP |
| 3 | Expor o Service publicamente | 5 min | Carteira Digital alcança o Service |
| 4 | Instalar o SDK no projeto React | 5 min | @mosip/react-inji-verify-sdk instalado |
| 5 | Adicionar componente de verificação | 15 min | QR Code exibido na tela |
| 6 | Testar ponta a ponta | 15 min | Credencial verificada com sucesso |
Etapa 1 — Preparar VM com Docker
docker --version
docker compose versionSe não tiver Docker, veja Setup da VM e Docker.
Resultado: Docker e Docker Compose funcionando.
Etapa 2 — Subir INJI Verify Service
Crie o arquivo docker-compose.yml e suba os containers:
docker compose up -dVeja a configuração completa em Subindo o INJI Verify Service.
Resultado:
curl -s http://localhost:8080/v1/verify/health
# { "status": "UP" }Etapa 3 — Expor o Service publicamente
A Carteira Digital (no celular do cidadão) precisa acessar o INJI Verify Service. Em desenvolvimento, use ngrok:
ngrok http 8080Anote a URL pública (ex: https://abc123.ngrok-free.app). Atualize as variáveis de ambiente do Service:
INJI_VP_SUBMISSION_BASE_URL=https://abc123.ngrok-free.app/v1/verifyINJI_DID_VERIFY_URI=did:web:abc123.ngrok-free.app:v1:verifyINJI_DID_VERIFY_PUBLIC_KEY_URI=did:web:abc123.ngrok-free.app:v1:verify#key-0
Reinicie o Service:
docker compose down && docker compose up -dEm produção, use um domínio real com HTTPS. Veja Produção e Operação.
Resultado: URL pública acessível pelo celular.
Etapa 4 — Instalar o SDK no projeto React
npm install @mosip/react-inji-verify-sdkO SDK requer React 18.2.0+ e TypeScript 4.9.5+ como peer dependencies.
Resultado: Pacote instalado sem erros.
Etapa 5 — Adicionar componente de verificação
// src/components/VerificaIdade.tsx
import { OpenID4VPVerification } from '@mosip/react-inji-verify-sdk';
// Substitua pela URL do seu INJI Verify Service
const VERIFY_SERVICE_URL = 'https://abc123.ngrok-free.app/v1/verify';
// Substitua pelo DID do seu verificador
const CLIENT_ID_DID = 'did:web:abc123.ngrok-free.app:v1:verify';
// Presentation Definition para verificação de idade 18+
// Substitua pela definição fornecida no seu credenciamento
const presentationDefinition = {
id: 'age-verification-18-plus',
input_descriptors: [
{
id: 'age_credential',
format: {
'vc+sd-jwt': {
'sd-jwt_alg_values': ['ES256']
}
},
constraints: {
fields: [
{
path: ['$.ageOver18'],
filter: {
type: 'boolean',
const: true
}
}
]
}
}
]
};
export function VerificaIdade() {
const handleVerificado = (txnId: string) => {
console.log('Verificação concluída. Transaction ID:', txnId);
// Busque o resultado no seu backend se necessário
// ou use onVpProcessed para receber o resultado direto
};
const handleErro = (error: unknown) => {
console.error('Erro na verificação:', error);
};
const handleQrExpirado = () => {
console.log('QR Code expirou');
};
return (
<div>
<h2>Verificação de Idade</h2>
<OpenID4VPVerification
verifyServiceUrl={VERIFY_SERVICE_URL}
clientId={CLIENT_ID_DID}
protocol="openid4vp://"
presentationDefinition={presentationDefinition}
onVpReceived={handleVerificado}
onError={handleErro}
onQrCodeExpired={handleQrExpirado}
/>
</div>
);
}
Resultado: Componente renderiza QR Code na tela.
Etapa 6 — Testar ponta a ponta
- Acesse sua aplicação React no navegador
- O QR Code aparece na tela
- Abra a INJI Wallet no celular
- Escaneie o QR Code
- Autorize o compartilhamento da credencial na Wallet
- O SDK recebe o resultado via callback
Resultado esperado (no console):
Verificação concluída. Transaction ID: abc-123-def-456
Alternativa: Receber resultado completo no frontend
Se preferir receber o resultado diretamente (sem buscar no backend), use onVpProcessed em vez de onVpReceived:
<OpenID4VPVerification
verifyServiceUrl={VERIFY_SERVICE_URL}
clientId={CLIENT_ID_DID}
protocol="openid4vp://"
presentationDefinition={presentationDefinition}
onVpProcessed={(results) => {
// results: Array<{ vc: unknown, vcStatus: "SUCCESS" | "INVALID" | "EXPIRED" }>
const verificado = results.some(r => r.vcStatus === 'SUCCESS');
console.log('Idade verificada:', verificado);
}}
onError={(error) => console.error(error)}
onQrCodeExpired={() => console.log('QR expirou')}
/>
A documentação do INJI recomenda usar onVpReceived em produção e buscar o resultado pelo txnId no backend para maior segurança. O onVpProcessed é adequado para desenvolvimento e testes.
Próximo passo
Para entender o fluxo em detalhes, veja Fluxo de Verificação.