Table des matières
Introduction
La gestion des identités et des accès est un élément crucial de toute application moderne. Les utilisateurs s'attendent à des expériences de connexion fluides et sécurisées, tandis que les développeurs cherchent des solutions robustes qui ne compromettent pas la sécurité. AWS Cognito répond à ces besoins en offrant un service complet de gestion des identités qui peut être intégré facilement dans vos applications web et mobiles.
Dans un monde où la multiplication des mots de passe devient problématique pour les utilisateurs, la possibilité de se connecter via des identités sociales (comme Google ou Apple) représente une amélioration significative de l'expérience utilisateur. AWS Cognito simplifie considérablement l'implémentation de ces fournisseurs d'identité, tout en offrant des fonctionnalités avancées comme l'authentification multi-facteurs, les flux personnalisés et l'évolutivité automatique.
AWS Cognito propose deux composants principaux : les groupes d'utilisateurs (User Pools) qui servent d'annuaire d'utilisateurs avec des fonctionnalités d'authentification, et les groupes d'identités (Identity Pools) qui permettent d'accorder un accès temporaire aux ressources AWS à vos utilisateurs authentifiés.
Dans cet article, nous explorerons en profondeur le fonctionnement d'AWS Cognito, avant de nous concentrer sur l'intégration avec Google et Apple en tant que fournisseurs d'identité. Nous couvrirons les aspects théoriques et pratiques avec des exemples de code concrets pour vous aider à implémenter ces solutions dans vos propres applications.
Qu'est-ce qu'AWS Cognito ?
AWS Cognito est un service géré qui permet d'ajouter rapidement des fonctionnalités d'inscription, de connexion et de contrôle d'accès à vos applications web et mobiles. Il s'agit d'une solution complète de gestion des identités qui prend en charge l'authentification native ainsi que la fédération via des fournisseurs d'identité sociaux et d'entreprise.
Groupes d'utilisateurs (User Pools)
Les groupes d'utilisateurs sont des annuaires d'utilisateurs dans AWS Cognito. Ils gèrent l'ensemble du processus d'authentification et fournissent des fonctionnalités telles que :
Inscription et confirmation des utilisateurs par email ou téléphone
Politiques de mot de passe personnalisables et conformes aux normes de sécurité
Authentification multi-facteurs (MFA)
Intégration avec des fournisseurs d'identité externes (Google, Facebook, Apple, etc.)
Flux d'authentification personnalisés avec des déclencheurs Lambda
Fonctionnalités de sécurité avancées comme la protection contre la force brute
Groupes d'identités (Identity Pools)
Les groupes d'identités permettent à vos utilisateurs d'accéder à des ressources AWS après leur authentification. Les principales fonctionnalités comprennent :
Attribution de rôles IAM temporaires aux utilisateurs authentifiés et non authentifiés
Accès contrôlé aux services AWS comme DynamoDB, S3, et bien d'autres
Mapping des attributs utilisateurs à des rôles IAM pour un contrôle d'accès précis
Support pour les utilisateurs authentifiés via les groupes d'utilisateurs Cognito ou des fournisseurs externes
Comment User Pools et Identity Pools fonctionnent ensemble
Bien qu'ils puissent être utilisés séparément, ces deux services sont souvent combinés : le User Pool gère l'authentification (qui est l'utilisateur), tandis que l'Identity Pool gère l'autorisation (à quelles ressources AWS cet utilisateur peut accéder).
Flux d'authentification
AWS Cognito prend en charge plusieurs flux d'authentification pour répondre à différents besoins d'application :
Flux d'authentification standard : Utilise le nom d'utilisateur et le mot de passe directement
Flux personnalisé (avec défis d'authentification) : Permet de créer des flux d'authentification sur mesure via Lambda
Flux d'authentification sécurisé par serveur (SRP) : Implémente le protocole SRP pour éviter la transmission de mots de passe en clair
Flux avec jetons d'actualisation : Utilise des jetons d'actualisation pour obtenir de nouveaux jetons d'accès sans nouvelle authentification
Mise en place d'AWS Cognito
Avant d'intégrer Google et Apple en tant que fournisseurs d'identité, nous devons d'abord configurer un groupe d'utilisateurs Cognito. Voici les étapes essentielles :
Création d'un groupe d'utilisateurs
- Connectez-vous à la console AWS et accédez au service Cognito
- Cliquez sur "Créer un groupe d'utilisateurs"
- Configurez les attributs utilisateur (email, nom, numéro de téléphone, etc.)
- Définissez les politiques de mot de passe et les paramètres de sécurité
- Configurez les flux d'inscription et de vérification
- Paramétrez les messages de vérification (email/SMS)
- Configurez les déclencheurs Lambda si nécessaire
- Créez une application cliente pour votre groupe d'utilisateurs
Lors de la création de l'application cliente, assurez-vous de générer un secret client si vous utilisez une application côté serveur. Pour les applications purement côté client (comme une SPA), vous pouvez désactiver le secret client.
Intégration avec AWS Amplify
La façon la plus simple d'intégrer Cognito dans une application front-end est d'utiliser la bibliothèque AWS Amplify, qui fournit des API de haut niveau pour l'authentification :
1# Installation d'AWS Amplify
2npm install aws-amplify
1// Configuration de base d'Amplify
2import { Amplify } from 'aws-amplify';
3
4Amplify.configure({
5 Auth: {
6 region: 'us-east-1',
7 userPoolId: 'us-east-1_xxxxxxxxx',
8 userPoolWebClientId: 'xxxxxxxxxxxxxxxxxxxxxxxxxx',
9 mandatorySignIn: true,
10 authenticationFlowType: 'USER_SRP_AUTH'
11 }
12});
Fournisseurs d'identité fédérés
L'authentification fédérée permet aux utilisateurs de se connecter à votre application en utilisant leurs identités existantes auprès d'autres fournisseurs. Cela simplifie l'expérience utilisateur en évitant la création d'un nouveau mot de passe et améliore la sécurité en déléguant l'authentification à des fournisseurs établis.
Avantages de l'authentification fédérée
Expérience utilisateur améliorée : Connexion simplifiée sans nouveau mot de passe à mémoriser
Sécurité renforcée : Délégation de l'authentification à des fournisseurs qui investissent massivement dans la sécurité
Réduction des frictions : Augmentation des taux de conversion en facilitant l'inscription
Accès aux informations du profil : Possibilité de récupérer des informations comme l'email, le nom ou la photo de profil
Support multi-appareils : Cohérence de l'authentification entre le web et le mobile
AWS Cognito supporte de nombreux fournisseurs d'identité, mais concentrons-nous sur l'intégration de Google et Apple, qui sont parmi les plus demandés aujourd'hui.
Intégration avec Google
Configuration côté Google
Pour intégrer Google à votre groupe d'utilisateurs Cognito, vous devez d'abord configurer un projet dans la Google Cloud Console :
- Accédez à la Google Cloud Console
- Créez un nouveau projet ou sélectionnez un projet existant
- Accédez à "APIs & Services" > "Credentials"
- Cliquez sur "Create Credentials" > "OAuth client ID"
- Sélectionnez le type d'application (Web, Android, iOS)
- Configurez l'URI de redirection vers votre application ou le point de terminaison Cognito
- Notez l'ID client et le secret client générés
Pour l'URI de redirection Cognito, utilisez le format : https://[domaine-cognito]/oauth2/idpresponse, où [domaine-cognito] est le domaine de votre groupe d'utilisateurs (par exemple, auth.example.com si vous utilisez un domaine personnalisé, ou [préfixe].auth.[région].amazoncognito.com pour un domaine Cognito standard).
Configuration de Google dans Cognito
Une fois que vous avez vos identifiants Google, configurez le fournisseur d'identité dans votre groupe d'utilisateurs Cognito :
- Accédez à votre groupe d'utilisateurs dans la console AWS Cognito
- Sous l'onglet "Sign-in experience", allez à la section "Federated identity provider sign-in"
- Cliquez sur "Add identity provider" et sélectionnez "Google"
- Entrez l'ID client et le secret client Google que vous avez obtenus précédemment
- Configurez les étendues (scopes) demandées (par exemple, profile, email)
- Configurez le mappage des attributs entre Google et Cognito (par exemple, email à email)
- Enregistrez vos changements
Implémentation côté client avec Amplify
Voici comment implémenter la connexion via Google dans une application React en utilisant AWS Amplify :
1import React from 'react';
2import { Auth } from 'aws-amplify';
3
4const GoogleLogin = () => {
5 const signInWithGoogle = () => {
6 // Rediriger vers la page d'authentification Cognito avec Google comme fournisseur
7 Auth.federatedSignIn({ provider: 'Google' });
8 };
9
10 return (
11 <button onClick={signInWithGoogle} className="google-signin-button">
12 Se connecter avec Google
13 </button>
14 );
15};
16
17export default GoogleLogin;
Pour une application plus complète, vous devez également gérer la récupération des informations de l'utilisateur après l'authentification réussie :
1import React, { useEffect, useState } from 'react';
2import { Auth, Hub } from 'aws-amplify';
3
4const AuthComponent = () => {
5 const [user, setUser] = useState(null);
6 const [authLoading, setAuthLoading] = useState(true);
7
8 useEffect(() => {
9 // Vérifier si l'utilisateur est déjà connecté
10 checkUserAuth();
11
12 // Configurer un écouteur d'événements pour les changements d'authentification
13 const unsubscribe = Hub.listen('auth', ({ payload }) => {
14 const { event } = payload;
15
16 if (event === 'signIn') {
17 // L'utilisateur s'est connecté avec succès
18 checkUserAuth();
19 } else if (event === 'signOut') {
20 // L'utilisateur s'est déconnecté
21 setUser(null);
22 }
23 });
24
25 // Nettoyer l'écouteur lors du démontage du composant
26 return () => {
27 unsubscribe();
28 };
29 }, []);
30
31 const checkUserAuth = async () => {
32 try {
33 const userData = await Auth.currentAuthenticatedUser();
34 setUser(userData);
35 } catch (error) {
36 console.log('Aucun utilisateur connecté');
37 setUser(null);
38 } finally {
39 setAuthLoading(false);
40 }
41 };
42
43 const signOut = async () => {
44 try {
45 await Auth.signOut();
46 setUser(null);
47 } catch (error) {
48 console.error('Erreur lors de la déconnexion:', error);
49 }
50 };
51
52 const signInWithGoogle = () => {
53 Auth.federatedSignIn({ provider: 'Google' });
54 };
55
56 if (authLoading) return <div>Chargement...</div>;
57
58 return (
59 <div className="auth-container">
60 {user ? (
61 <div className="user-info">
62 <h2>Bienvenue, {user.attributes?.name || 'Utilisateur'}</h2>
63 <p>Email: {user.attributes?.email}</p>
64 {user.attributes?.picture && (
65 <img src={user.attributes.picture} alt="Profile" className="profile-picture" />
66 )}
67 <button onClick={signOut}>Se déconnecter</button>
68 </div>
69 ) : (
70 <div className="login-options">
71 <h2>Veuillez vous connecter</h2>
72 <button onClick={signInWithGoogle} className="google-signin-button">
73 Se connecter avec Google
74 </button>
75 {/* Autres options de connexion... */}
76 </div>
77 )}
78 </div>
79 );
80};
81
82export default AuthComponent;
Validation côté serveur
Dans certains cas, vous devrez valider les jetons d'authentification côté serveur. Voici un exemple avec Node.js :
1// server.js - Express avec middleware d'authentification Cognito
2const express = require('express');
3const jwt = require('jsonwebtoken');
4const jwksClient = require('jwks-rsa');
5const axios = require('axios');
6
7const app = express();
8
9// Configuration du client JWKS pour vérifier les jetons JWT de Cognito
10const client = jwksClient({
11 jwksUri: `https://cognito-idp.${process.env.AWS_REGION}.amazonaws.com/${process.env.USER_POOL_ID}/.well-known/jwks.json`
12});
13
14// Fonction pour obtenir la clé publique utilisée pour signer le jeton
15function getKey(header, callback) {
16 client.getSigningKey(header.kid, function(err, key) {
17 if (err) return callback(err);
18 const signingKey = key.publicKey || key.rsaPublicKey;
19 callback(null, signingKey);
20 });
21}
22
23// Middleware d'authentification
24const authenticateJWT = (req, res, next) => {
25 const authHeader = req.headers.authorization;
26
27 if (!authHeader || !authHeader.startsWith('Bearer ')) {
28 return res.status(401).json({ error: 'Token d\'authentification manquant' });
29 }
30
31 const token = authHeader.split(' ')[1];
32
33 jwt.verify(token, getKey, { algorithms: ['RS256'] }, (err, decoded) => {
34 if (err) {
35 return res.status(401).json({ error: 'Token invalide ou expiré' });
36 }
37
38 // Vérifier que le jeton a été émis pour notre application
39 if (decoded.client_id !== process.env.APP_CLIENT_ID &&
40 decoded.aud !== process.env.APP_CLIENT_ID) {
41 return res.status(403).json({ error: 'Token non autorisé pour cette application' });
42 }
43
44 // Ajouter l'utilisateur décodé à l'objet de requête
45 req.user = decoded;
46 next();
47 });
48};
49
50// Route protégée qui nécessite une authentification
51app.get('/api/protected-resource', authenticateJWT, (req, res) => {
52 // L'utilisateur est authentifié, accéder à ses informations via req.user
53 res.json({
54 message: 'Ressource protégée accessible',
55 user: {
56 sub: req.user.sub,
57 email: req.user.email,
58 // Autres attributs d'utilisateur...
59 }
60 });
61});
62
63app.listen(3000, () => {
64 console.log('Serveur démarré sur le port 3000');
65});
Intégration avec Apple
L'intégration avec Apple est particulièrement importante pour les applications iOS, car Apple exige désormais que les applications qui proposent d'autres méthodes de connexion sociale offrent également "Sign in with Apple" comme option.
Configuration côté Apple
La configuration d'Apple comme fournisseur d'identité demande quelques étapes spécifiques :
- Accédez au portail développeur Apple
- Naviguez vers "Certificates, Identifiers & Profiles"
- Sous "Identifiers", créez un nouvel identifiant d'application ou sélectionnez-en un existant
- Activez la capacité "Sign In with Apple"
- Créez un "Services ID" spécifique pour votre application web
- Configurez les domaines et les URL de redirection
- Créez une clé privée avec la capacité "Sign In with Apple"
- Notez l'ID d'équipe, l'ID de service, l'ID de clé et téléchargez la clé privée
Contrairement à Google, "Sign in with Apple" utilise un mécanisme basé sur des jetons JWT avec une clé privée pour la vérification côté serveur, ce qui rend sa configuration légèrement plus complexe.
Configuration d'Apple dans Cognito
Voici comment configurer Apple comme fournisseur d'identité dans Cognito :
- Accédez à votre groupe d'utilisateurs dans la console AWS Cognito
- Sous l'onglet "Sign-in experience", allez à la section "Federated identity provider sign-in"
- Cliquez sur "Add identity provider" et sélectionnez "Apple"
- Entrez l'ID de service, l'ID d'équipe et l'ID de clé
- Téléchargez la clé privée que vous avez obtenue du portail développeur Apple
- Configurez les étendues demandées (généralement name et email)
- Configurez le mappage des attributs entre Apple et Cognito
- Enregistrez vos changements
Implémentation côté client avec Amplify
L'intégration d'Apple dans votre application est similaire à celle de Google, mais avec quelques différences selon la plateforme :
1import React from 'react';
2import { Auth } from 'aws-amplify';
3
4const AppleLogin = () => {
5 const signInWithApple = () => {
6 // Rediriger vers la page d'authentification Cognito avec Apple comme fournisseur
7 Auth.federatedSignIn({ provider: 'SignInWithApple' });
8 };
9
10 return (
11 <button onClick={signInWithApple} className="apple-signin-button">
12 Se connecter avec Apple
13 </button>
14 );
15};
16
17export default AppleLogin;
Pour une application iOS native, l'intégration nécessite l'utilisation du SDK Apple et une approche légèrement différente. Voici un exemple avec React Native :
1// Pour React Native avec expo-apple-authentication
2import React from 'react';
3import { View, Platform } from 'react-native';
4import * as AppleAuthentication from 'expo-apple-authentication';
5import { Auth } from 'aws-amplify';
6
7const AppleLoginNative = () => {
8 // Vérifier si l'appareil supporte Sign in with Apple
9 const [isAppleAvailable, setIsAppleAvailable] = React.useState(false);
10
11 React.useEffect(() => {
12 const checkAvailability = async () => {
13 const available = await AppleAuthentication.isAvailableAsync();
14 setIsAppleAvailable(available);
15 };
16
17 checkAvailability();
18 }, []);
19
20 const signInWithApple = async () => {
21 try {
22 const credential = await AppleAuthentication.signInAsync({
23 requestedScopes: [
24 AppleAuthentication.AppleAuthenticationScope.FULL_NAME,
25 AppleAuthentication.AppleAuthenticationScope.EMAIL,
26 ],
27 });
28
29 // Utiliser le jeton pour s'authentifier auprès de Cognito
30 if (credential.identityToken) {
31 const result = await Auth.federatedSignIn(
32 'SignInWithApple', // Le nom du fournisseur dans Cognito
33 { token: credential.identityToken, expires_at: 3600 }, // Le jeton et sa durée de validité
34 { // Attributs utilisateur supplémentaires
35 name: credential.fullName?.givenName || '',
36 email: credential.email || '',
37 }
38 );
39
40 console.log('Authentification réussie:', result);
41 }
42 } catch (error) {
43 console.error('Erreur lors de l\'authentification Apple:', error);
44 }
45 };
46
47 // N'afficher le bouton que si Sign in with Apple est disponible
48 if (!isAppleAvailable || Platform.OS !== 'ios') return null;
49
50 return (
51 <View>
52 <AppleAuthentication.AppleAuthenticationButton
53 buttonType={AppleAuthentication.AppleAuthenticationButtonType.SIGN_IN}
54 buttonStyle={AppleAuthentication.AppleAuthenticationButtonStyle.BLACK}
55 cornerRadius={5}
56 style={{ width: 200, height: 44 }}
57 onPress={signInWithApple}
58 />
59 </View>
60 );
61};
62
63export default AppleLoginNative;
Considérations spécifiques à Apple
L'intégration avec Apple présente quelques spécificités importantes à prendre en compte :
Emails privés : Apple peut fournir des emails anonymisés (relais) si l'utilisateur choisit de masquer son email réel
Informations du premier login : Apple ne fournit le nom et l'email qu'au premier login, vous devez donc les stocker
Renouvellement des clés privées : Les clés privées Apple expirent après 6 mois et doivent être renouvelées
Validation côté serveur : Nécessite une validation spécifique avec la clé privée pour le backend
Design des boutons : Apple impose des contraintes strictes sur l'apparence des boutons "Sign in with Apple"
Pour gérer le fait qu'Apple ne renvoie les informations utilisateur qu'une seule fois, utilisez un déclencheur Lambda de pré-inscription Cognito pour capturer et stocker ces informations de manière persistante.
Implémentations avancées
Authentification avec UI personnalisée
Si vous ne souhaitez pas utiliser la redirection fournie par Amplify, vous pouvez créer une interface utilisateur entièrement personnalisée. Voici un exemple d'implémentation pour Google (applicable de manière similaire à Apple) :
1import React from 'react';
2import { Auth } from 'aws-amplify';
3// Utilisez react-google-login ou un SDK similaire
4import { GoogleLogin } from 'react-google-login';
5
6const CustomGoogleAuth = () => {
7 const handleGoogleResponse = async (response) => {
8 if (response.tokenId) {
9 try {
10 // Utilisez le jeton d'identité Google pour vous authentifier auprès de Cognito
11 const cognitoUser = await Auth.federatedSignIn(
12 'google',
13 { token: response.tokenId, expires_at: response.tokenObj.expires_at },
14 { email: response.profileObj.email, name: response.profileObj.name }
15 );
16
17 console.log('Utilisateur authentifié:', cognitoUser);
18
19 // Rediriger ou mettre à jour l'état de l'application
20 } catch (error) {
21 console.error('Erreur lors de l\'authentification Cognito:', error);
22 }
23 }
24 };
25
26 const handleGoogleFailure = (error) => {
27 console.error('Échec de connexion Google:', error);
28 };
29
30 return (
31 <div>
32 <GoogleLogin
33 clientId="VOTRE_ID_CLIENT_GOOGLE"
34 buttonText="Se connecter avec Google"
35 onSuccess={handleGoogleResponse}
36 onFailure={handleGoogleFailure}
37 cookiePolicy={'single_host_origin'}
38 isSignedIn={false}
39 />
40 </div>
41 );
42};
43
44export default CustomGoogleAuth;
Gestion des attributs personnalisés
Vous pouvez mapper des attributs supplémentaires depuis les fournisseurs d'identité et les stocker dans Cognito :
1// Utilisation de Lambda Pre Sign-up pour enrichir le profil utilisateur
2exports.handler = async (event, context) => {
3 // Pour l'authentification fédérée
4 if (event.triggerSource === "PreSignUp_ExternalProvider") {
5 const provider = event.request.userAttributes['identities']
6 ? JSON.parse(event.request.userAttributes['identities'])[0].providerName
7 : null;
8
9 if (provider === "Google" || provider === "SignInWithApple") {
10 // Ajout d'attributs personnalisés basés sur les données du fournisseur
11 event.response.autoConfirmUser = true;
12 event.response.autoVerifyEmail = true;
13
14 // Si nous avons des attributs supplémentaires provenant du fournisseur
15 if (event.request.userAttributes['custom:source']) {
16 // Exemple : ajouter un attribut personnalisé comme la date de première connexion
17 event.request.userAttributes['custom:firstLogin'] = new Date().toISOString();
18 }
19 }
20 }
21
22 return event;
23};
Configuration multi-tenant
Pour les applications SaaS, vous pourriez vouloir une configuration multi-tenant avec Cognito :
1// Exemple de sélection dynamique du groupe d'utilisateurs en fonction du tenant
2const configureCognitoForTenant = (tenantId) => {
3 // Mapping des tenants vers leurs configurations Cognito respectives
4 const tenantConfigs = {
5 tenant1: {
6 userPoolId: 'us-east-1_aaaaaaaaa',
7 userPoolWebClientId: 'abcdefghijklmnopqrstuvwxyz',
8 region: 'us-east-1'
9 },
10 tenant2: {
11 userPoolId: 'us-east-1_bbbbbbbbb',
12 userPoolWebClientId: 'zyxwvutsrqponmlkjihgfedcba',
13 region: 'us-east-1'
14 }
15 // Autres tenants...
16 };
17
18 // Récupérer la configuration pour ce tenant
19 const config = tenantConfigs[tenantId] || tenantConfigs.default;
20
21 // Configurer Amplify pour ce tenant
22 Amplify.configure({
23 Auth: {
24 region: config.region,
25 userPoolId: config.userPoolId,
26 userPoolWebClientId: config.userPoolWebClientId,
27 mandatorySignIn: true
28 }
29 });
30
31 return config;
32};
33
34// Utilisation
35const currentTenant = detectTenantFromUrl(); // Fonction qui détecte le tenant actuel
36configureCognitoForTenant(currentTenant);
Bonnes pratiques de sécurité
L'implémentation d'une authentification sécurisée nécessite de suivre certaines bonnes pratiques :
Validation côté serveur : Ne faites jamais confiance uniquement à l'authentification côté client
HTTPS partout : Utilisez toujours HTTPS pour toutes les communications liées à l'authentification
Vérification des jetons : Validez l'émetteur, l'audience et l'expiration des jetons JWT
Système de déconnexion robuste : Implémentez un mécanisme efficace pour invalider les sessions
Protection contre le CSRF : Utilisez des mesures anti-CSRF comme un état aléatoire dans les flux OAuth
Audit et journalisation : Enregistrez les événements d'authentification pour la détection d'incidents
Rotation des secrets : Changez régulièrement les secrets des applications clientes
Liste de contrôle de sécurité
Utilisez cette liste pour évaluer la sécurité de votre implémentation Cognito :
✅ Les URL de redirection sont-elles strictement validées et limitées aux domaines autorisés ?
✅ L'authentification multi-facteurs est-elle activée pour les opérations sensibles ?
✅ Les politiques de mot de passe sont-elles suffisamment robustes ?
✅ Les attributs sensibles sont-ils correctement protégés dans les jetons ?
✅ Les jetons d'accès ont-ils une durée de vie raisonnablement courte ?
✅ Les adresses IP et appareils suspects sont-ils détectés ?
✅ Existe-t-il un processus de réponse aux incidents de sécurité ?
Protection avancée
AWS Cognito propose des fonctionnalités de sécurité avancées comme la protection contre la prise de contrôle de compte (Account Takeover Protection) et la détection des risques adaptatifs. Ces fonctionnalités sont disponibles dans le cadre des fonctionnalités de sécurité avancées, qui peuvent être activées dans les paramètres du groupe d'utilisateurs.
Résolution des problèmes courants
Lors de l'intégration de fournisseurs d'identité sociaux avec Cognito, vous pourriez rencontrer certains problèmes. Voici des solutions aux problèmes les plus courants :
Problèmes de redirection
Erreur 'redirect_uri mismatch' : Vérifiez que les URI de redirection configurées dans les consoles Google/Apple correspondent exactement à celles utilisées par Cognito
Erreurs CORS : Pour les applications SPA, configurez correctement les origines autorisées dans les paramètres du client d'application Cognito
Erreur 'response_type not supported' : Assurez-vous que le flux d'authentification configuré est pris en charge par le fournisseur
Échec de redirection après authentification : Vérifiez la configuration de l'attribut 'callbackUrl' dans federatedSignIn()
Problèmes de jeton
Jetons expirés trop rapidement : Ajustez la durée de vie des jetons dans les paramètres d'application cliente
Erreurs de validation de jeton : Assurez-vous que l'horloge du serveur est synchronisée correctement
Attributs manquants dans les jetons : Vérifiez que le mappage d'attributs est correctement configuré dans la console Cognito
Jetons d'actualisation invalides : Vérifiez que les jetons d'actualisation sont activés pour votre application cliente
1// Fonction utilitaire pour vérifier la validité d'un jeton JWT
2const isTokenValid = (token) => {
3 try {
4 // Décoder le jeton sans vérification (juste pour l'inspection)
5 const decodedToken = jwt_decode(token);
6
7 // Vérifier l'expiration
8 const currentTime = Math.floor(Date.now() / 1000);
9 if (decodedToken.exp && decodedToken.exp < currentTime) {
10 console.log('Jeton expiré');
11 return false;
12 }
13
14 // Vérifier l'émetteur (iss)
15 const expectedIssuer = `https://cognito-idp.${region}.amazonaws.com/${userPoolId}`;
16 if (decodedToken.iss !== expectedIssuer) {
17 console.log('Émetteur invalide');
18 return false;
19 }
20
21 // Vérifier l'audience (aud ou client_id)
22 if (decodedToken.aud !== clientId && decodedToken.client_id !== clientId) {
23 console.log('Audience invalide');
24 return false;
25 }
26
27 // Si toutes les vérifications sont passées
28 return true;
29 } catch (error) {
30 console.error('Erreur lors de la validation du jeton:', error);
31 return false;
32 }
33};
Pour un débogage approfondi des problèmes d'authentification, activez la journalisation détaillée dans Amplify: Amplify.Logger.LOG_LEVEL = 'DEBUG';
avant la configuration.
Conclusion
AWS Cognito offre une solution robuste et complète pour la gestion des identités dans vos applications. L'intégration de fournisseurs d'identité sociaux comme Google et Apple améliore considérablement l'expérience de connexion tout en réduisant les frictions pour vos utilisateurs.
Points clés à retenir :
Flexibilité : Cognito s'adapte à divers cas d'utilisation, du plus simple au plus complexe
Expérience utilisateur améliorée : L'intégration sociale simplifie l'inscription et la connexion
Sécurité renforcée : La délégation de l'authentification à des fournisseurs établis améliore la sécurité
Évolutivité : Cognito gère automatiquement la mise à l'échelle à mesure que votre base d'utilisateurs croît
Personnalisation : Les déclencheurs Lambda permettent d'adapter le comportement à vos besoins spécifiques
En suivant les meilleures pratiques décrites dans cet article et en comprenant les nuances de l'intégration avec Google et Apple, vous pouvez créer un système d'authentification sécurisé et convivial qui répond aux attentes des utilisateurs modernes tout en protégeant efficacement vos ressources.
Pour aller plus loin
Explorez d'autres fonctionnalités avancées de Cognito comme l'authentification multi-facteurs, les contrôles d'accès basés sur les attributs, et l'intégration avec d'autres services AWS comme API Gateway, AppSync, et Lambda pour créer des applications complètes et sécurisées.