Aller au contenu principal

Authentification OAuth

En bref

Ontologie prend en charge le protocole OAuth2 avec PKCE (Proof Key for Code Exchange) pour les applications qui necessitent une authentification au nom d'un utilisateur. Ce flux est recommande pour les applications frontend et mobiles.

Quand utiliser OAuth ?

MethodeCas d'usage
Cle APIScripts, automatisations, integrations serveur a serveur
OAuth2 PKCEApplications frontend, applications mobiles, integrations qui agissent au nom d'un utilisateur

OAuth est necessaire lorsque :

  • Votre application doit acceder aux donnees d'un utilisateur specifique
  • Vous ne pouvez pas stocker de secret cote client (application frontend)
  • Vous souhaitez que l'utilisateur autorise explicitement l'acces

Flux OAuth2 PKCE

Etape 1 : Generer le code verifier et le challenge

Votre application genere un code_verifier aleatoire et calcule le code_challenge correspondant :

// Generer un code verifier aleatoire
function generateCodeVerifier(): string {
const array = new Uint8Array(32);
crypto.getRandomValues(array);
return btoa(String.fromCharCode(...array))
.replace(/\+/g, '-')
.replace(/\//g, '_')
.replace(/=+$/, '');
}

// Calculer le code challenge (SHA-256)
async function generateCodeChallenge(verifier: string): Promise<string> {
const encoder = new TextEncoder();
const data = encoder.encode(verifier);
const hash = await crypto.subtle.digest('SHA-256', data);
return btoa(String.fromCharCode(...new Uint8Array(hash)))
.replace(/\+/g, '-')
.replace(/\//g, '_')
.replace(/=+$/, '');
}

Etape 2 : Rediriger l'utilisateur

Redirigez l'utilisateur vers la page d'autorisation :

https://auth.ontologie-growthsystemes.com/authorize?
response_type=code
&client_id=VOTRE_CLIENT_ID
&redirect_uri=https://votre-app.com/callback
&scope=read:nodes write:nodes
&code_challenge=CODE_CHALLENGE
&code_challenge_method=S256
&state=RANDOM_STATE
ParametreDescription
client_idIdentifiant de votre application (obtenu lors de l'enregistrement)
redirect_uriURL de retour apres autorisation (doit correspondre a celle enregistree)
scopePermissions demandees, separees par des espaces
code_challengeHash SHA-256 du code verifier
stateValeur aleatoire pour proteger contre les attaques CSRF

Etape 3 : Echanger le code contre un token

Apres autorisation, l'utilisateur est redirige vers votre redirect_uri avec un code :

const response = await fetch('https://auth.ontologie-growthsystemes.com/token', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
grant_type: 'authorization_code',
code: 'CODE_RECU',
redirect_uri: 'https://votre-app.com/callback',
client_id: 'VOTRE_CLIENT_ID',
code_verifier: 'CODE_VERIFIER_ORIGINAL',
}),
});

const { access_token, refresh_token, expires_in } = await response.json();

Etape 4 : Utiliser le token

Incluez le token dans vos requetes API :

curl -H "Authorization: Bearer ACCESS_TOKEN" \
-H "x-workspace-id: WORKSPACE_ID" \
"https://api.ontologie-growthsystemes.com/api/queries/nodes"

Etape 5 : Rafraichir le token

Lorsque le token expire, utilisez le refresh token :

const response = await fetch('https://auth.ontologie-growthsystemes.com/token', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
grant_type: 'refresh_token',
refresh_token: 'VOTRE_REFRESH_TOKEN',
client_id: 'VOTRE_CLIENT_ID',
}),
});

Scopes OAuth

Les scopes disponibles sont identiques a ceux des cles API :

ScopeDescription
read:nodesLire les entites
write:nodesCreer et modifier les entites
read:edgesLire les relations
write:edgesCreer et modifier les relations
read:livedataLire les sources Live Data
write:livedataGerer les sources Live Data

Pour la liste complete, consultez Permissions.

Securite

PratiqueDescription
Stockez les tokens de maniere securiseeUtilisez le stockage securise du navigateur (pas le localStorage)
Validez le parametre stateComparez le state retourne avec celui envoye
Utilisez toujours PKCENe transmettez jamais le code verifier dans l'URL
Duree de vie des tokensAccess token : 1 heure. Refresh token : 30 jours
RevocationRevoquez les tokens via l'endpoint /revoke lorsqu'un utilisateur se deconnecte

Avec le SDK

Le package @ontologie/oauth simplifie le flux OAuth :

import { createOAuthClient } from '@ontologie/oauth';

const oauth = createOAuthClient({
clientId: 'VOTRE_CLIENT_ID',
redirectUri: 'https://votre-app.com/callback',
scopes: ['read:nodes', 'write:nodes'],
});

// Demarrer le flux
const authUrl = await oauth.getAuthorizationUrl();
window.location.href = authUrl;

// Callback : echanger le code
const tokens = await oauth.handleCallback(window.location.search);

Voir aussi

Besoin d'aide ?

Ecrivez-nous : Support et contact.