Tutoriel AWS API Gateway - Étape 5
Étape 6 - Utilisation des jetons d’identité pour le flux Identité
Dans cette dernière étape, vous allez :
Transmettre l’identité au service en passant votre jeton Web JSON OpenID (JWT);
Valider le jeton;
Extraire les informations de profil pour attribuer un acheteur à un animal de compagnie.
Utilisation d’un jeton d’ID
Vous pouvez utiliser votre fonction Lambda pour traiter et obtenir des informations sur l’utilisateur. Par exemple, lors d’une transaction d’achat, vous avez récupéré le nom d’utilisateur à partir du profil renvoyé avec le jeton d’ID. Cependant, vous pouvez également choisir d’intégrer les informations de l’utilisateur à l’identité elle-même, qui est un jeton Web JSON (JWT).
L’utilisation des JWT présente l’avantage de pouvoir :
Vérifier l’authenticité du JWT;
Être sûr que l’utilisateur appelant est authentifié (au lieu de se fier à un paramètre en texte clair qui pourrait avoir été falsifié).
En outre, vous pouvez utiliser le JWT pour l’autorisation, ce qui vous permet de contourner l’intégration IAM avec Amazon API Gateway. Notez toutefois que l’utilisation de l' API Gateway pour l’autorisation vous permet d’interrompre l’appel API avant l’invocation de votre fonction Lambda.
Ajout d’informations au JWT
Il existe plusieurs façons d’ajouter les informations d’un utilisateur au JWT. L’exemple suivant ajoute l’adresse courriel de l’utilisateur au JWT, mais les concepts sont les mêmes pour les autres données de l’utilisateur.
Règles d’utilisation
Une façon d’ajouter l’adresse courriel d’un utilisateur au JWT est d’utiliser une règle. Il s’agit d’une bonne approche si vous voulez vous assurer que cette valeur est toujours disponible dans le JWT pour un utilisateur qui s’authentifie.
Dans login.js
, vous pouvez voir cette permission spécifiée dans les paramètres passés à auth.signin
:
$scope.login = function() {
var params = {
authParams: {
scope: 'openid email'
}
};
auth.signin(params, function(profile, token) {
...
}
}
Was this helpful?
Bien que vous puissiez inclure le profil complet de l’utilisateur dans le JWT, vous ne devez inclure que ce qui est nécessaire puisque le JWT est généralement transmis avec chaque requête.
Validation du jeton JWT
Étant donné que la console AWS Lambda a accès à un nombre limité de modules Node qui peuvent être utilisés lorsque vous entrez votre code Node.js à l’aide de la console du navigateur, vous devrez inclure des modules supplémentaires et téléverser la fonction Lambda en tant que package pour traiter le jeton d’ID.
Pour plus de détails, consultez Création de paquets de déploiement à l’aide de Node.js et Téléversement des paquets de déploiement et tests.
Le projet « seed » suivant contient le code dont vous aurez besoin pour votre fonction AWS Lambda mise à jour.
<%= include('../../../_includes/_package', { org: 'auth0', repo: 'auth0-aws', path: 'examples/api-gateway/lambda' }) %>
Vous verrez deux fichiers JavaScript personnalisés dans le projet seed :
index.js
: contient votre code principal;auth0-variables
: contient le code que vous devez mettre à jour.
Outre les fichiers personnalisés, il existe un fichier Node.js standard package.json
.
Le code ajoute une fonctionnalité permettant d’extraire des informations et de valider le JWT. Par défaut, Auth0 utilise une clé symétrique pour signer le JWT, bien que vous puissiez choisir d’utiliser des clés asymétriques (si vous avez besoin d’autoriser la validation de votre jeton par un tiers, vous devriez utiliser une clé asymétrique et ne partager que votre clé publique).
Pour plus d’informations sur la vérification des jetons, consultez Protocoles d’identité pris en charge par Auth0.
Mettez à jour auth0-variables.js
avec votre clé secrète, qui peut être trouvée dans l’onglet Paramètres de votre application dans l’Auth0 Dashboard :
var env={};
env.AUTH0_SECRET='{yourAuth0Secret}';
module.exports = env;
Was this helpful?
Exécutez npm install depuis le répertoire où se trouvent vos fichiers, zippez le contenu (index.js
doit être à la racine du zip), et téléversez-le pour qu’il soit utilisé par la fonction Lambda PurchasePet
. Si vous testez, vous devriez voir un échec d’autorisation, puisque le JWT n’est pas dans le corps du message.
Regardez la logique dans index.js
. Vous verrez la logique autour de la ligne 60 qui valide le jeton et extrait les informations décodées qui contiennent les informations d’identité utilisées pour la logique d’achat :
if(event.authToken) {
jwt.verify(event.authToken, secret, function(err, decoded) {
if(err) {
console.log('failed jwt verify: ', err, 'auth: ', event.authToken);
context.done('authorization failure', null);
} else if(!decoded.email)
{
console.log('err, email missing in jwt', 'jwt: ', decoded);
context.done('authorization failure', null);
} else {
userEmail = decoded.email;
console.log('authorized, petId', petId, 'userEmail:', userEmail);
dynamo.getItem({TableName:"Pets", Key:{username:"default"}}, readcb);
}
});
} else {
console.log('invalid authorization token', event.authToken);
context.done('authorization failure', null);
}
...
Was this helpful?
Extraire les informations de profil pour affecter un acheteur
La dernière étape consiste à transmettre le JWT à la méthode utilisée par le navigateur client.
La méthode standard s’accompagne d’un en-tête Autorisation
en tant que jeton du porteur, et vous pouvez utiliser cette méthode en désactivant l’autorisation IAM et en vous appuyant uniquement sur le jeton OpenID pour l’autorisation (vous devrez également mapper l’en-tête Autorisation dans les données d’événement transmises à la fonction AWS Lambda).
Toutefois, si vous utilisez IAM, la passerelle API AWS utilise l’en-tête Autorisation
pour contenir la signature du message, et vous interromprez l’authentification en insérant le JWT dans cet en-tête. Pour ce faire, vous pouvez soit
Ajouter un en-tête personnalisé pour le JWT,
soit placer l’en-tête personnalisé dans le corps du message.
Si vous choisissez d’utiliser un en-tête personnalisé, vous devrez également effectuer un mappage pour la requête d’intégration de la méthode POST pour pets/purchase
.
Pour simplifier le processus de validation, transmettez le JWT dans le corps du message à la fonction AWS Lambda. Pour ce faire, mettez à jour la méthode buyPet
dans home.js
en supprimant le userName
du corps et en ajoutant authToken
comme suit :
function buyPet(user, id) {
var apigClient = getSecureApiClient();
var body = {
petId:id,
authToken: store.get('token')
};
apigClient.petsPurchasePost({}, body)
.then(function(response) {
console.log(response);
$scope.pets = response.data;
$scope.$apply();
}).catch(function (response) {
alert('buy pets failed');
showError(response);
});
}
Was this helpful?
Téléversez votre code dans votre bucket S3 et essayez d’acheter un animal de compagnie. Vous verrez le courriel de l’acheteur dans le message résultant.
Si vous rencontrez des erreurs, vérifiez que vous avez correctement défini votre clé secrète. Un outil utile pour vérifier les problèmes de décodage des jetons est jwt.io.
Résumé
Dans ce tutoriel, vous avez réalisé ce qui suit :
Créé une API à l’aide d’AWS API Gateway qui inclut des méthodes utilisant des fonctions AWS Lamdba.
Sécurisé l’accès à votre API à l’aide des rôles IAM.
Intégré un fournisseur d’identités SAML avec IAM pour associer l’accès à l’API à votre base d’utilisateurs.
Fourni différents niveaux d’accès selon que l’utilisateur s’authentifie à partir de la base de données ou de la connexion sociale.
Utilisé une règle Auth0 pour renforcer l’attribution des rôles.
Utilisé un JWT pour fournir un contexte d’autorisation supplémentaire et transmettre les informations d’identité à la fonction Lambda appropriée.