OAuth e Service Canvas
Queria si integra con API esterne autenticate tramite Service Canvas -- canvas DSL speciali con purpose = SERVICE che descrivono come autorizzare un provider OAuth2 e quali operazioni espongono. Le credenziali utente vengono memorizzate cifrate in un vault e referenziate dai canvas consumatori (CHAT, INGESTION, WIDGET) tramite il tipo connection_ref.
BYO (Bring Your Own)
V1/V2 supportano solo l'approccio BYO: il tenant porta il proprio client_id e client_secret OAuth registrati presso il provider. Queria non fornisce e non certifica app OAuth proprie verso provider terzi.
Quando serve
| Caso d'uso | Esempio |
|---|---|
| Chat che invia messaggi su un canale | Slack, Microsoft Teams |
| Pipeline che crea eventi calendario | Google Calendar, Microsoft 365 |
| Ingestione automatica da SaaS | Notion, Confluence, GitHub Issues |
| Constructor che chiama API a pagamento | Stripe, Salesforce, HubSpot |
| Cloud storage avanzato | Google Drive con permessi delegati, OneDrive |
Per cloud storage base con login utente personale, esistono gia i connettori standard documentati in Impostazioni > Storage Cloud.
Architettura
┌────────────────────────────────────────┐
│ Service Canvas "Slack OAuth" │
│ purpose = SERVICE │
│ ┌──────────────┐ ┌─────────────────┐ │
│ │ oauth2_config│ │ operation_def[] │ │
│ │ client_id │ │ post_message │ │
│ │ client_secret│ │ list_channels │ │
│ │ auth_url │ │ get_user_email │ │
│ │ token_url │ └─────────────────┘ │
│ │ scopes[] │ │
│ └──────────────┘ │
└────────────────────────────────────────┘
^ referenziato da
│
┌─────────────────────────────┐
│ Canvas CHAT consumer │
│ ... -> external_tool( │
│ serviceCanvasId='slack', │
│ operationId='post_msg') │
└─────────────────────────────┘
│ runtime
v
┌────────────────────────────────────┐
│ ExternalServiceConnection (DB) │
│ per (serviceCanvasId, │
│ companyId, userId) │
│ -> accessToken (cifrato AES-256) │
│ -> refreshToken (cifrato) │
│ -> scopes, expiresAt │
└────────────────────────────────────┘Tre concetti chiave:
- Service canvas -- definizione del provider (chi e, come si autorizza, quali endpoint espone).
- External_tool node -- usato nei canvas CHAT/INGESTION per chiamare un'operazione del service canvas.
- Connection -- riga in DB con i token cifrati per la coppia (utente, service).
Creare un service canvas
L'admin segue questi passi:
1. Registra l'app OAuth presso il provider
Esempio Slack:
- Vai su
https://api.slack.com/appse crea una nuova app. - Configura Redirect URL =
https://admin.queria.pro/api/oauth/callback/slack(sostituisci con il dominio Queria del tuo tenant). - Definisci gli scopes richiesti (es.
chat:write,channels:read). - Copia
client_ideclient_secret.
2. Crea il service canvas
- Pannello admin > DSL e Pipeline > OAuth e Service Canvas > Nuovo.
- Scegli un template provider (Slack, Google Workspace, Microsoft 365, GitHub, Notion, Custom).
- Incolla
client_ideclient_secretnei campi del nodooauth2_config. Ilclient_secrete crittografato server-side (AES-256-GCM). - Verifica
auth_url,token_url,scopes(precompilati dal template, modificabili). - Aggiungi i nodi
operation_defcon metodo HTTP, path, parametri input/output. Puoi importarli da OpenAPI 3.x (per provider che lo espongono). - Salva. Il canvas viene validato e marcato
ACTIVE.
3. Gli utenti si autorizzano
Sul service canvas appare un pulsante Connect. Quando un utente lo clicca:
- Redirect al provider per autorizzazione (consenso utente, scopes).
- Provider redirect indietro con
code. - Backend scambia
codeperaccess_token+refresh_token. - I token vengono cifrati e salvati in
ExternalServiceConnectionper(serviceCanvasId, companyId, userId). - L'utente vede la connessione come Connected e puo revocarla in qualsiasi momento.
Usare la connessione in un canvas
Nel canvas CHAT/INGESTION aggiungi un nodo external_tool:
{
"type": "external_tool",
"params": {
"serviceCanvasId": "slack-oauth-canvas-id",
"operationId": "post_message",
"inputs": {
"channel": "{{sys.target_channel}}",
"text": "{{llm_writer_1.output}}"
},
"outputName": "slack_response"
}
}A runtime:
- Il motore carica il service canvas.
- Trova l'operation
post_message. - Risolve la connection per
(serviceCanvasId, companyId, ctx.userId). - Se il token e scaduto, lo refresh automaticamente.
- Esegue la chiamata HTTP con
Authorization: Bearer <access_token>. - Scrive la risposta in
sys.slack_response.
Gestione delle connessioni
Pannello admin > OAuth e Service Canvas > [service] > Connections:
- Tabella di tutte le connessioni per quel service canvas (utenti, scopes, stato, ultimo uso).
- Stato possibile:
ACTIVE,EXPIRED(refresh fallito),REVOKED,ERROR. - Revoca lato Queria (rimuove i token cifrati) e -- se il provider lo supporta -- chiama l'endpoint di revoca remoto.
- Audit log: chi ha autorizzato, quando, con quali scopes, quale canvas ha consumato la connection.
Sicurezza
- Token a riposo: cifrati con AES-256-GCM. La chiave master
LLM_VAULT_KEKderiva daJWT_SECRET(assicurarsi che in produzione non sia il defaultdev-secret-change-me). - Token in transito: solo HTTPS verso il provider; le call interne attraversano la rete Docker isolata.
- Scopes minimi: il template ti suggerisce gli scopes minimi per operazione. Non richiedere
admin:*se non serve. - Per-utente: ogni connection appartiene a un singolo utente. Quando un canvas viene eseguito, usa il token dell'utente che ha triggerato l'esecuzione (
ctx.userId). - Audit: ogni chiamata
external_toolcon OAuth registra(userId, serviceCanvasId, operationId, statusCode, latencyMs)inIntegrationCallLog.
Limiti e roadmap
V1/V2 attuali:
- Solo
authorization_codeflow. - BYO client only (no Queria-owned verified apps).
- No
client_credentials(M2M) -- in roadmap V3. - No
device_codeflow. - No domain-wide delegation Google Workspace.
- No webhook inbound dal provider (in roadmap separata).
- Import operazioni da OpenAPI 3.x in V1.2.
Best practice
- Un service canvas per provider, anche se usi piu operations: semplifica la gestione token.
- Documenta gli scopes nel nome o description del canvas: "Slack (chat:write only)" e meglio di "Slack OAuth".
- Limita gli operation_def attivi: aggiungi solo le operazioni effettivamente usate.
- Test su tenant pilota: prima di abilitare per tutti, prova su un'azienda interna.
- Monitora EXPIRED: un calo di refresh riusciti spesso indica che il provider ha rivocato l'app o cambiato le policy.
Queria v3.5.0 -- External Tools OAuth V2 + Service Canvas