AI Connect/Integration/Patrones Multi-Tenant

Patrones Multi-Tenant

Pregunta a la IA sobre Vinkius

Un único cliente con alcance de aplicación, el alcance resuelto antes de la entrada de la solicitud, capacidades devueltas solo para el usuario autenticado y un límite de aislamiento que puede poner a prueba.

Un único cliente Vinkius atiende a todos los usuarios de su aplicación. El aislamiento procede de cómo derive el externalId, no de las instancias del cliente. Esta página es la lista de comprobación de seguridad para integrar el SDK en un backend multiusuario.

Vinkius nunca conoce a tus usuarios reales. La plataforma conoce tu Application y el identificador opaco que pasa tu backend, nada más. Los correos electrónicos, los nombres y los perfiles se quedan en tus sistemas; Vinkius solo ve el alcance de usuario que tu código resolvió.

Cree un cliente con alcance de aplicación

typescript
// lib/vinkius.ts — server only
import { Vinkius } from '@vinkius/connect';

export const vinkius = new Vinkius({
  appId: process.env.VINKIUS_APP_ID!,
  apiKey: process.env.VINKIUS_APP_KEY!,
});

El cliente contiene credenciales de la aplicación, nunca estado por usuario. No cree un cliente por usuario; el alcance del usuario viaja en la ruta.

Resuelva el alcance antes de leer la entrada de la solicitud

Vincule el externalId a su sesión autenticada antes que nada. El límite de autorización es su consulta de sesión; un App ID y una clave autorizan la aplicación, nunca a un usuario del navegador:

typescript
async function handleCapabilities(request: Request) {
  const session = await requireSession(request); // your auth code
  const capabilities = await vinkius.user(session.userId).capabilities();
  // ...
}

Devuelva solo las capacidades del usuario autenticado

Proyecte los campos que su cliente necesita y nada más. Los objetos de capacidad ya están limitados al usuario que la sesión resolvió:

typescript
return Response.json(
  capabilities.map(({ name, description, inputSchema }) => ({
    name,
    description,
    inputSchema,
  })),
);

Autorice la configuración de conectores por separado

Escribir credenciales es una operación privilegiada. Compruebe que la sesión puede administrar el conector de ese usuario antes de llamar a connect() y credentials.set():

typescript
const github = vinkius.user(session.userId).connector('github');
await github.connect();
await github.credentials.set({ GITHUB_TOKEN: submittedToken });

Ejecute solo capacidades cargadas en el mismo alcance

Las capacidades incorporan la ruta de conexión que las produjo. Nunca acepte un nombre de capacidad del cliente y lo ejecute contra un identificador resuelto de otro alcance; cargue el conjunto de capacidades dentro de la solicitud autenticada y despache a partir de él:

typescript
const capabilities = await vinkius.user(session.userId).capabilities();
const capability = capabilities.findCapability(requestedName);
if (!capability) {
  return Response.json({ error: 'not available for this user' }, { status: 404 });
}
const result = await capability.execute(args, { idempotencyKey });

Use metadatos solo para contexto no secreto de la aplicación

user.ensure(metadata) crea o actualiza el usuario y almacena contexto de la aplicación, como el nivel del plan o etiquetas. No es un almacén de credenciales; guarde los secretos en las credenciales de los conectores, que son de solo escritura.

Pruebe el límite de aislamiento

Dos usuarios que conectan el mismo conector jamás deben ver el estado del otro. Una forma mínima de prueba:

typescript
const alice = vinkius.user('alice_123');
const bob = vinkius.user('bob_456');

await alice.connector('github').connect();
const bobConnectors = await bob.connectors();

// bob's list must not contain alice's connection

Ejecútelo contra un entorno de staging con su propio App ID y clave. Consulte Authentication and scope para conocer las reglas de separación de entornos.

Próximos pasos