Skip to content

Receitas

Proteger uma tool com um scope

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 });