Alloovium

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

DimensionClé APIOAuth 2.1
Best forYour own backend calling AllooviumThird-party apps acting on behalf of a user
IdentityFixed user + tenant at key creationEnd user signs in via Clerk; token carries that user's id
LifetimeUntil revokedAccess token 1 hour, refresh token 30 days
RegistrationDeveloper ConsoleDynamic Client Registration (RFC 7591) or Developer Console
FlowSend Bearer headerPKCE authorization code → token exchange → Bearer
ScopesGranted at key creationRequested 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é :

text
ak_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.

http
GET /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

Les clés accordent un accès serveur-à-serveur complet au tenant. Si vous avez besoin d'une authentification utilisateur final dans un navigateur ou une application native, utilisez OAuth 2.1.

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 :

CodeSignification
missing_api_keyNo Authorization header or not Bearer scheme
invalid_api_keyKey does not match any active credential
api_key_revokedKey was revoked via the dashboard
api_key_expiredKey passed its expiry date
user_inactiveOwning user has been deactivated
tenant_disabledOwning tenant is suspended
payment_requiredBilling 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 :

bash
curl 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 :

bash
curl -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

Les clients enregistrés dynamiquement reçoivent toujours des scopes en lecture seule. Pour obtenir un secret client confidentiel ou pré-provisionner un client à l'avance, utilisez la Console développeur.

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 :

text
https://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 :

bash
curl -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

bash
curl -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)

bash
curl -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.

ScopeAccorde
vault:readList projects, get projects, list documents, get documents, search
vault:writeCreate projects, upload documents
chat:readList conversations, fetch conversation history
chat:writeAsk chat (streaming and non-streaming)
templates:readPoll template-fill job status
templates:writeStart template-fill jobs
workflows:readList workflows, get run status
workflows:writeStart workflow runs
meta:readReserved; not currently required by any capability

meta.whoami est sans scope

L'endpoint 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 type et un URI de redirection loopback localhost.