Concepts fondamentaux
Authentification
L'API publique d'Alloovium prend en charge deux types d'identifiants : les clés API longue durée pour les intégrations serveur-à-serveur, et OAuth 2.1 avec PKCE pour les agents utilisateurs comme Claude Desktop, Cursor et ChatGPT.
Choisir entre clés API et OAuth
| Dimension | Clé API | OAuth 2.1 |
|---|---|---|
| Best for | Your own backend calling Alloovium | Third-party apps acting on behalf of a user |
| Identity | Fixed user + tenant at key creation | End user signs in via Clerk; token carries that user's id |
| Lifetime | Until revoked | Access token 1 hour, refresh token 30 days |
| Registration | Developer Console | Dynamic Client Registration (RFC 7591) or Developer Console |
| Flow | Send Bearer header | PKCE authorization code → token exchange → Bearer |
| Scopes | Granted at key creation | Requested at authorize; capped by the registered client scope |
Authentification par clé API
Format de clé
Les clés font 60 caractères, préfixées par l'environnement et encodées en base32 pour la lisibilité :
textak_live_AB7K2LJ8MZ4X3WQ9VYTC5H6NPRDFG8EJUSKBHMV2YXQW3TKRP4DL ak_test_NC9PQ2MJ8MZ4X3WQ9VYTC5H6NPRDFG8EJUSKBHMV2YXQW3TKRPAA
Les clés live s'exécutent dans l'environnement de production. Les clés test sont pour la CI et le développement local. Le préfixe détermine le contexte de tenant dans lequel la clé s'exécute, mais les deux peuvent appeler les mêmes capabilities.
Seuls les quatre premiers caractères après le préfixe d'environnement (ex. example) sont stockés en clair pour l'affichage. Le reste est haché au repos ; si vous perdez une clé, vous devez en créer une nouvelle.
Envoyer la clé
Attachez-la comme header header sur chaque requête. L'API rejette les clés dans les query strings, cookies ou corps JSON.
httpGET /api/v2/vault/projects HTTP/1.1 Host: api.alloovium.com Authorization: Bearer ak_live_AB7K2LJ8MZ4X3WQ9VYTC5H6NPRDFG8EJUSKBHMV2YXQW3TKRP4DL Accept: application/json
Ne jamais mettre les clés dans du code côté client
Réponses 401
Si le header est manquant, malformé, révoqué, expiré ou ne correspond à aucune clé, l'API retourne code avec un header header et l'un de ces codes :
| Code | Signification |
|---|---|
| missing_api_key | No Authorization header or not Bearer scheme |
| invalid_api_key | Key does not match any active credential |
| api_key_revoked | Key was revoked via the dashboard |
| api_key_expired | Key passed its expiry date |
| user_inactive | Owning user has been deactivated |
| tenant_disabled | Owning tenant is suspended |
| payment_required | Billing is past due |
Rotation des clés
Créez une nouvelle clé, basculez le trafic, puis révoquez l'ancienne. Les deux peuvent coexister, donc la rotation sans interruption est simple. La révocation est immédiate — en quelques secondes dans toutes les régions.
OAuth 2.1 avec PKCE
Pour les intégrations qui agissent au nom d'un utilisateur final — agents LLM, plugins IDE, extensions navigateur — utilisez le flux de code d'autorisation OAuth 2.1 avec PKCE. Alloovium suit spec strictement : chaque client doit utiliser PKCE ; le flux implicite et le grant par mot de passe ne sont pas supportés.
Découverte des métadonnées (RFC 8414)
Chaque client OAuth commence par récupérer les métadonnées du serveur d'autorisation :
bashcurl https://api.alloovium.com/.well-known/oauth-authorization-server
json{ "issuer": "https://api.alloovium.com", "authorization_endpoint": "https://api.alloovium.com/api/v2/oauth/authorize", "token_endpoint": "https://api.alloovium.com/api/v2/oauth/token", "revocation_endpoint": "https://api.alloovium.com/api/v2/oauth/revoke", "registration_endpoint": "https://api.alloovium.com/api/v2/oauth/register", "response_types_supported": ["code"], "grant_types_supported": ["authorization_code", "refresh_token"], "code_challenge_methods_supported": ["S256"], "token_endpoint_auth_methods_supported": ["none", "client_secret_basic", "client_secret_post"], "scopes_supported": [ "vault:read", "chat:read", "templates:read", "workflows:read", "meta:read" ] }
Un document de métadonnées de ressource protégée correspondant (RFC 9728) est servi sur path.
Dynamic Client Registration (RFC 7591)
Pas de pré-provisionnement. N'importe quel client peut s'enregistrer lui-même sur path :
bashcurl -sS https://api.alloovium.com/api/v2/oauth/register \ -H "Content-Type: application/json" \ -d '{ "client_name": "My Claude Desktop Integration", "redirect_uris": ["http://127.0.0.1:51234/callback"], "grant_types": ["authorization_code", "refresh_token"], "response_types": ["code"], "token_endpoint_auth_method": "none" }'
json{ "client_id": "client_d6kQ6ZrW9v3sLx2n2h0k5Q", "client_name": "My Claude Desktop Integration", "redirect_uris": ["http://127.0.0.1:51234/callback"], "grant_types": ["authorization_code", "refresh_token"], "response_types": ["code"], "token_endpoint_auth_method": "none", "scope": "vault:read chat:read templates:read workflows:read meta:read" }
Les scopes DCR sont limités
Clients gérés depuis le tableau de bord
La Console développeur vous permet de créer des clients PKCE publics et des clients confidentiels avec un secret unique. C'est le chemin recommandé lorsque vous souhaitez un enregistrement de client stable avant de déployer une intégration.
Code d'autorisation avec PKCE
Générez un verifier aléatoire (43–128 chars URL-safe), calculez challenge, puis redirigez l'utilisateur vers l'endpoint d'autorisation :
texthttps://api.alloovium.com/api/v2/oauth/authorize ?client_id=client_d6kQ6ZrW9v3sLx2n2h0k5Q &redirect_uri=http://127.0.0.1:51234/callback &response_type=code &scope=vault:read%20chat:read &state=xyz123 &code_challenge=E9Melhoa2OwvFrEMTJguCHaoeK1t8URWbuGJSstw-cM &code_challenge_method=S256
Si l'utilisateur n'est pas déjà connecté, il sera redirigé vers Clerk pour s'authentifier. Après approbation, le navigateur est redirigé vers votre uri avec params.
Échange de token
Échangez le code contre une paire access token + refresh token :
bashcurl -sS https://api.alloovium.com/api/v2/oauth/token \ -H "Content-Type: application/x-www-form-urlencoded" \ -d "grant_type=authorization_code" \ -d "code=AUTH_CODE_FROM_REDIRECT" \ -d "client_id=client_d6kQ6ZrW9v3sLx2n2h0k5Q" \ -d "redirect_uri=http://127.0.0.1:51234/callback" \ -d "code_verifier=THE_RANDOM_VERIFIER_YOU_GENERATED"
json{ "access_token": "eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9...", "token_type": "Bearer", "expires_in": 3600, "refresh_token": "rt_9c1e4e4ebf97a4b5e76cf9c85e2f09bb", "scope": "vault:read chat:read" }
L'access token est un JWT signé avec les claims Échange de token, tid, client_id et scope. Attachez-le comme bearer sur chaque appel API.
Rafraîchir l'accès
bashcurl -sS https://api.alloovium.com/api/v2/oauth/token \ -H "Content-Type: application/x-www-form-urlencoded" \ -d "grant_type=refresh_token" \ -d "refresh_token=rt_9c1e4e4ebf97a4b5e76cf9c85e2f09bb" \ -d "client_id=client_d6kQ6ZrW9v3sLx2n2h0k5Q"
Les refresh tokens tournent à chaque utilisation. L'ancien est immédiatement invalidé, et la réponse contient un nouveau refresh token. Si un token ayant tourné est rejoué, Alloovium révoque toute la chaîne — une défense standard OAuth 2.1 contre le vol de token.
Clients confidentiels
Si votre client enregistré utilise basic ou post, l'endpoint de token exige le secret correspondant sur chaque échange et requête de rafraîchissement. Stockez ce secret côté serveur uniquement.
Révocation (RFC 7009)
bashcurl -sS https://api.alloovium.com/api/v2/oauth/revoke \ -H "Content-Type: application/x-www-form-urlencoded" \ -d "token=rt_9c1e4e4ebf97a4b5e76cf9c85e2f09bb" \ -d "client_id=client_d6kQ6ZrW9v3sLx2n2h0k5Q"
Capabilities compatibles OAuth
Toutes les capabilities n'acceptent pas les tokens OAuth. Certains handlers s'appuient sur des champs ORM complets qui ne sont présents que pour les principaux à clé API ; ceux-là retournent code lorsqu'ils sont appelés avec un Bearer JWT. Vous pouvez vérifier le support sur chaque page de capability ou dans la colonne OAuth de la matrice des capabilities.
Scopes
Les scopes sont le vocabulaire d'autorisation pour l'API publique. Les clés API et les tokens OAuth portent un ensemble de scopes ; les handlers en requièrent de spécifiques.
| Scope | Accorde |
|---|---|
| vault:read | List projects, get projects, list documents, get documents, search |
| vault:write | Create projects, upload documents |
| chat:read | List conversations, fetch conversation history |
| chat:write | Ask chat (streaming and non-streaming) |
| templates:read | Poll template-fill job status |
| templates:write | Start template-fill jobs |
| workflows:read | List workflows, get run status |
| workflows:write | Start workflow runs |
| meta:read | Reserved; not currently required by any capability |
meta.whoami est sans scope
path requiert n'importe quel identifiant valide mais aucun scope spécifique, donc les health checks réussissent toujours.Lorsqu'un handler rejette un appel pour des scopes manquants, vous obtenez code avec un tableau field dans le corps du problème — voir Erreurs.
Recommandations de stockage
- Stockez les clés API dans un gestionnaire de secrets (AWS Secrets Manager, HashiCorp Vault, Doppler, 1Password). Ne les committez jamais dans le contrôle de source.
- Les refresh tokens OAuth doivent être chiffrés au repos. Faites-les tourner à chaque utilisation ; l'ancien est mort immédiatement.
- Pour les intégrations basées sur navigateur, n'intégrez jamais une clé API. Utilisez OAuth PKCE avec un client
typeet un URI de redirection loopback localhost.