Receitas
import { assertScope, verifyPassport } from 'agent-passport';
const passport = await verifyPassport(passportJwt);
function guarded<T extends (...a: any[]) => any>(scope: string, fn: T): T {
return (async (...args: Parameters<T>) => {
assertScope(passport, scope); // lança exceção se não concedido
return fn(...args);
}) as T;
}
const sendEmail = guarded('email:send', rawSendEmail);
Construir um registo de auditoria à prova de adulteração
import { signAction, verifyAction } from 'agent-passport';
async function withAudit(agent, type: string, target: string, run: () => Promise<unknown>) {
const result = await run();
const proof = await signAction(agent, { type, target });
await auditStore.append({ proof, at: new Date().toISOString() });
return result;
}
// mais tarde, provar quem o fez:
const { agent } = await verifyAction(savedProof);
Verificar a cadeia de confiança completa
import { verifyPassport, verifyAction, hasScope } from 'agent-passport';
async function trust(actionJwt: string, passportJwt: string, operadoresConfiaveis: Set<string>) {
const action = await verifyAction(actionJwt);
const passport = await verifyPassport(passportJwt);
return (
passport.agent.id === action.agent && // o passaporte é deste agente
operadoresConfiaveis.has(passport.operator) && // o operador é confiável
hasScope(passport, action.action.type) // o scope cobre a ação
);
}
Passaportes de curta duração (rotação)
// reemite diariamente; o did:key não tem revogação, por isso mantém janelas curtas
await issuePassport({ operator, agentDid: agent.did, name: 'bot', scopes: ['crm:read'], expiresIn: 86400 });