Authentification & sécurité
Flux de lancement d'une app tierce, access_token court, origins autorisées, scopes et erreurs fréquentes.
Le flux d'authentification d'une app tierce est conçu pour ouvrir une app frontend externe au nom d'un utilisateur Superfasttt, sans exposer le jeton utilisateur à cette app.
Il repose sur deux jetons :
launch_token: jeton court, à usage unique, transmis dans l'URL de lancement de votre app.access_tokenapp : jeton Bearer court obtenu par votre frontend en échangeant lelaunch_token. Il sert ensuite aux appels API de votre app.
Vue d'ensemble
[Utilisateur Superfasttt] [Votre frontend] [API Superfasttt]
│
│ Ouvre votre app
│ URL: entry_url?launch_token=...
│ ───────────────────────────────►
│
│ │ POST /api/v1/app-platform/runtime/exchange
│ │ body: { launch_token }
│ │ ───────────────────────────────►
│ │
│ │ { access_token, expires_in, scopes }
│ │ ◄───────────────────────────────
│
│ │ Authorization: Bearer <access_token>
│ │ /api/v1/app-data/...
│ │ /api/v1/rich-documents/...
│ │ /api/v1/app-assets/...Règles du launch_token
- Il est généré par Superfasttt pour ouvrir une app installée.
- Il expire rapidement.
- Il ne peut être utilisé qu'une seule fois.
- Il doit être échangé immédiatement par le frontend de votre app.
- Après l'échange, retirez
launch_tokende l'URL avecwindow.history.replaceState.
Ne stockez pas le launch_token. Ne le transmettez pas à des services tiers.
Échanger le launch_token
const launchToken = new URL(window.location.href).searchParams.get("launch_token");
const response = await fetch(
"https://api.superfasttt.ai/api/v1/app-platform/runtime/exchange",
{
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({ launch_token: launchToken }),
}
);
if (!response.ok) {
throw new Error(`Exchange failed: ${response.status}`);
}
const session = await response.json();Réponse :
{
"access_token": "<app_access_token>",
"token_type": "Bearer",
"expires_in": 900,
"scopes": ["app_data:read", "app_data:write"]
}Utiliser l'access_token app
await fetch("https://api.superfasttt.ai/api/v1/app-data/inspections/query", {
method: "POST",
headers: {
Authorization: `Bearer ${session.access_token}`,
"Content-Type": "application/json"
},
body: JSON.stringify({ page: 1, page_size: 50 })
});L'access_token app est limité :
- à l'app installée,
- à l'utilisateur qui l'a ouvert,
- aux permissions accordées,
- aux origins autorisées,
- à une durée courte.
Gardez-le en mémoire lorsque c'est possible. Évitez de le conserver durablement dans le navigateur.
Origins autorisées
Le manifest déclare les origins depuis lesquelles votre frontend peut appeler l'API :
"runtime": {
"type": "external",
"entry_url": "https://audit-pro.example.com",
"allowed_origins": ["https://audit-pro.example.com"]
}L'origin doit correspondre exactement à celle envoyée par le navigateur :
https://audit-pro.example.comethttps://www.audit-pro.example.comsont deux origins différentes.http://localhost:3000ethttp://localhost:3001sont deux origins différentes.- Les chemins ne font pas partie de l'origin. Déclarez
https://audit-pro.example.com, pashttps://audit-pro.example.com/app.
Pour tester avec curl, ajoutez explicitement le header Origin :
curl -X POST https://api.superfasttt.ai/api/v1/app-platform/runtime/exchange \
-H "Content-Type: application/json" \
-H "Origin: https://audit-pro.example.com" \
-d '{"launch_token":"<launch_token>"}'Scopes
Les scopes renvoyés à l'échange correspondent aux permissions accordées à l'installation.
| Scope | Autorise |
|---|---|
app_data:read | Lecture des records de vos collections. |
app_data:write | Création, modification et suppression des records. |
rich_documents:read | Lecture des documents riches. |
rich_documents:write | Création, modification, restauration et suppression des documents riches. |
assets:read | Liste, consultation et téléchargement des fichiers. |
assets:write | Upload, finalisation, rattachement et suppression des fichiers. |
Si une route retourne 403 missing_scope, ajoutez la permission nécessaire au
manifest, réimportez-le et réinstallez l'app.
Renouvellement de session
Il n'y a pas de refresh token dans le flux navigateur. Quand l'access_token
expire, l'utilisateur doit relancer l'app depuis Superfasttt pour obtenir un
nouveau launch_token, puis un nouvel access_token.
Pour une intégration serveur à serveur ou une tâche longue, contactez Superfasttt afin de définir le mode d'authentification approprié.
Bonnes pratiques frontend
- Échangez le
launch_tokendès le chargement de la page. - Supprimez
launch_tokende l'URL après l'échange. - Gardez l'
access_tokenen mémoire plutôt que dans un stockage persistant. - N'envoyez jamais l'
access_tokenà un domaine qui ne vous appartient pas. - Gérez proprement les expirations en proposant de rouvrir l'app.
- Déclarez séparément les origins de production, staging et développement.
Erreurs fréquentes
| HTTP | Code / detail | Cause probable | Action |
|---|---|---|---|
400 | invalid_launch_token_format | Le launch_token transmis est incomplet ou altéré. | Relire la valeur depuis l'URL et relancer l'app si besoin. |
401 | token_invalid_or_used_or_expired | Le launch_token est expiré ou déjà utilisé. | Générer un nouveau lancement. |
401 | Token app invalide ou expiré | L'access_token n'est plus valide. | Relancer l'app depuis Superfasttt. |
403 | origin_required | L'échange est fait sans header Origin. | Tester depuis le navigateur ou ajouter Origin en curl. |
403 | origin_not_allowed | L'origin n'est pas déclarée dans le manifest installé. | Corriger allowed_origins, réimporter et réinstaller. |
403 | installation_not_active | L'app n'est pas active pour cet espace client. | Vérifier l'installation côté client. |
403 | missing_scope | La permission nécessaire n'a pas été accordée. | Ajouter la permission, réimporter et réinstaller. |
404 | Ressource introuvable | La collection, le document ou le fichier demandé n'existe pas pour cette app. | Vérifier l'identifiant et le manifest installé. |

