Consentement OAuth granulaire pour les jeux : implémenter des permissions au niveau des scopes dans votre backend
En bref
Implémentez un consentement OAuth granulaire dans votre backend de jeu pour des permissions par scopes et une confiance renforcée.
Chaque développeur indépendant connaît le moment où un joueur hésite devant l'écran de permission. Votre jeu demande l'accès à sa liste d'amis, à son e-mail, à son historique d'achats—et il clique sur « Refuser ». Cette hésitation n'est pas irrationnelle ; c'est une réponse rationnelle à un choix tout-ou-rien qui ressemble à une violation de la vie privée. Cette friction impacte directement vos taux de conversion et la confiance des joueurs.
La récente mise à jour du système OAuth de Cloudflare introduit une solution puissante : un consentement granulaire basé sur les tâches. Au lieu de forcer les joueurs à approuver chaque permission dont votre jeu pourrait avoir besoin, vous pouvez désormais marquer des scopes spécifiques comme optionnels. Cela permet aux joueurs d'accorder uniquement les permissions avec lesquelles ils sont à l'aise pour la tâche en cours, un changement de paradigme pour les flux d'authentification des jeux.
Le problème des permissions tout-ou-rien dans les jeux
Le consentement OAuth traditionnel est binaire. Lorsque votre jeu demande des scopes comme profile.read, friends.list et inventory.write, le joueur voit un seul bouton « Approuver ». S'il n'est pas à l'aise pour accorder l'accès inventory.write à un outil tiers, sa seule option est de refuser toute la demande.
Cela crée plusieurs problèmes concrets pour les développeurs de jeux :
- Taux d'abandon élevés : Les joueurs soucieux de la sécurité quitteront simplement votre jeu plutôt que d'accorder un accès large.
- Sur-permission : Pour éviter l'abandon, les développeurs demandent souvent moins de scopes qu'ils n'en ont réellement besoin, ce qui handicape les fonctionnalités.
- Érosion de la confiance : Les joueurs apprennent à associer le flux de connexion de votre jeu à une perte de contrôle, ce qui nuit à la rétention à long terme.
Le problème central est qu'un joueur qui autorise une application compagnon pour un suivi de statistiques de base ne devrait pas être obligé de lui accorder également la capacité de modifier son équipement ou de dépenser de la monnaie en jeu.
Comment fonctionne le consentement OAuth basé sur les tâches
Le nouveau modèle permet aux développeurs de configurer un client OAuth avec deux types de scopes : obligatoires et optionnels. Lorsqu'un joueur initie un flux d'autorisation, il voit la liste complète des permissions demandées mais peut désélectionner celles qui sont marquées comme optionnelles.
Le détail technique clé est que cette évaluation se fait par demande d'autorisation, et non par rapport à l'ensemble des scopes configurés du client. C'est crucial pour les jeux, où différentes fonctionnalités nécessitent des permissions différentes.
Considérez un backend de jeu avec ces scopes :
player.profile.read(obligatoire pour la connexion de base)player.inventory.read(optionnel, pour une application compagnon)player.inventory.write(optionnel, pour un gestionnaire d'équipement)match.history.read(optionnel, pour le suivi des statistiques)
Un joueur utilisant un simple outil de suivi de statistiques ne demanderait que player.profile.read et match.history.read. L'écran de consentement afficherait les deux, mais comme match.history.read est optionnel, le joueur pourrait le désélectionner et continuer avec un jeton limité. Les scopes inventory n'apparaîtraient même pas car ils n'ont pas été demandés pour ce flux spécifique.
Implémenter le consentement granulaire dans votre backend de jeu
Passons à une implémentation pratique. Nous utiliserons un flux OAuth 2.0 générique que vous pouvez adapter à votre backend spécifique, qu'il s'agisse d'une solution personnalisée ou d'un service comme horizOn.
Étape 1 : Configurez votre client OAuth avec des scopes optionnels
Lors de l'enregistrement de votre application OAuth auprès de votre serveur d'autorisation (comme Cloudflare, ou le vôtre), vous définissez les scopes obligatoires et optionnels. Voici une configuration conceptuelle :
{
"client_id": "your_game_client_id",
"scopes": {
"required": ["player.profile.read"],
"optional": [
"player.inventory.read",
"player.inventory.write",
"match.history.read",
"match.history.write"
]
},
"redirect_uris": ["https://yourgame.com/callback"]
}
Cela indique au serveur d'autorisation : « Quand ce client demande des permissions, player.profile.read doit toujours être accordé s'il est demandé, mais les autres dépendent de l'utilisateur. »
Étape 2 : Gérez la demande et la réponse d'autorisation
Votre client de jeu initie le flux OAuth, en demandant les scopes nécessaires pour la tâche en cours. La partie critique vient après que le joueur approuve ou modifie la demande. Vous devez vérifier les scopes accordés dans la réponse, sans supposer que vous avez obtenu tout ce que vous avez demandé.
Voici un exemple simplifié en pseudocode pour gérer le rappel :
// Après que le joueur est redirigé vers votre jeu avec un code d'autorisation
async function handleOAuthCallback(authorizationCode) {
// Échangez le code contre des jetons
const tokenResponse = await fetch('/oauth/token', {
method: 'POST',
body: JSON.stringify({
code: authorizationCode,
client_id: CLIENT_ID,
client_secret: CLIENT_SECRET,
redirect_uri: REDIRECT_URI,
grant_type: 'authorization_code'
})
});
const tokens = await tokenResponse.json();
// CRITIQUE : Vérifiez les scopes accordés
const grantedScopes = tokens.scope.split(' ');
// Adaptez maintenant les fonctionnalités de votre jeu en fonction de ce qui a été réellement accordé
if (grantedScopes.includes('player.inventory.read')) {
enableInventoryViewer();
} else {
disableInventoryViewer();
showLimitedFunctionalityMessage();
}
if (grantedScopes.includes('match.history.read')) {
enableStatTracking();
} else {
disableStatTracking();
}
// Stockez le jeton avec son ensemble de scopes spécifique
storeUserSession({
accessToken: tokens.access_token,
scopes: grantedScopes,
// ... autres données de jeton
});
}
Étape 3 : Concevez l'interface de votre jeu pour les autorisations partielles
L'expérience utilisateur ne s'arrête pas à l'écran OAuth. Votre jeu doit gérer avec élégance un jeton avec moins de permissions que vous auriez idéalement souhaité.
Bonnes pratiques pour l'UI/UX :
- Soyez transparent : Si une fonctionnalité est désactivée en raison de permissions manquantes, expliquez au joueur pourquoi et comment il peut accorder l'accès plus tard.
- Proposez un chemin d'évolution : Incluez un bouton « Accorder plus de permissions » dans votre menu de paramètres pour relancer le flux OAuth avec les scopes optionnels.
- Dégradez avec élégance : Une application de suivi de statistiques qui ne dispose pas de
match.history.writedevrait toujours afficher les statistiques, juste sans la possibilité de sauvegarder des rapports personnalisés.
5 bonnes pratiques pour le consentement OAuth des jeux
Demandez des scopes minimum viables : Pour chaque fonctionnalité, identifiez les scopes absolument nécessaires. Rendez tout le reste optionnel. Un visualiseur de classement n'a besoin que de
match.history.read, pas dematch.history.write.Contextualisez les demandes de permission : Ne demandez pas tous les scopes possibles à la connexion. Demandez
inventory.writeuniquement lorsque le joueur essaie réellement d'utiliser l'éditeur d'équipement. Cela construit la confiance grâce au contexte.Stockez les ensembles de scopes par session : Un joueur peut accorder différents scopes à différentes applications compagnons. Votre backend doit associer chaque jeton d'accès à ses scopes accordés spécifiques et les appliquer au niveau de l'API.
Auditez vos définitions de scopes : Examinez régulièrement votre liste de scopes. Y a-t-il des scopes définis au début du développement qui ne sont plus utilisés ? Dépréciez-les. Une liste de scopes plus petite et plus propre est moins intimidante.
Implémentez la validation des scopes sur chaque endpoint : Votre API doit vérifier que le jeton d'accès entrant possède le scope requis pour la ressource demandée. C'est non négociable pour la sécurité. Un jeton avec uniquement
player.profile.readdoit être bloqué pour appeler/api/inventory.
Construire tout ce flux—configuration du client, écrans de consentement dynamiques, gestion des jetons sensibles aux scopes et validation backend—est une entreprise significative. Cela nécessite une intégration profonde avec votre serveur d'autorisation et une gestion minutieuse de l'état. C'est là qu'un service backend comme horizOn peut vous faire gagner des semaines de développement. Le système d'authentification de horizOn est conçu avec ces modèles modernes de consentement granulaire à l'esprit, fournissant des endpoints et des SDK préconfigurés qui gèrent la validation des scopes et les autorisations partielles dès le départ.
Implications de sécurité : pourquoi c'est important pour les backends de jeu
Le consentement granulaire n'est pas seulement une amélioration UX ; c'est un modèle d'architecture de sécurité. En limitant le rayon d'explosion d'un jeton compromis, vous protégez vos joueurs et l'économie de votre jeu.
Si une application tierce malveillante ne parvient à obtenir qu'un joueur accorde match.history.read, elle ne peut pas toucher à son inventaire ou à sa monnaie. Ce principe du moindre privilège est fondamental pour la conception de systèmes sécurisés. Pour une analyse plus approfondie de l'architecture des backends pour survivre aux compromissions, consultez notre analyse de la violation de données de Star Citizen.
Conclusion : construire la confiance grâce au contrôle
Le passage d'un consentement tout-ou-rien à un consentement OAuth basé sur les tâches est un avantage pour les joueurs et les développeurs. Les joueurs obtiennent le contrôle qu'ils exigent, ce qui conduit à des taux d'autorisation plus élevés et à une confiance accrue. Les développeurs obtiennent des ensembles de permissions plus précis, permettant des intégrations plus riches sans craindre de faire fuir les utilisateurs.
Commencez par auditer votre implémentation OAuth actuelle. Identifiez les scopes vraiment essentiels pour les fonctionnalités de base et ceux qui peuvent devenir optionnels. Implémentez la logique côté serveur pour gérer les autorisations partielles et mettez à jour l'interface de votre jeu pour communiquer clairement avec les joueurs sur ce que chaque permission permet.
En donnant le choix aux joueurs, vous ne limitez pas votre jeu—vous construisez une base de confiance qui soutient l'engagement à long terme et un écosystème plus sain pour les outils tiers et les applications compagnons.
Source : De tout-ou-rien au consentement OAuth basé sur les tâches