Comment obtenir le Cognito Identité id dans AWS Lambda
Comment puis-je obtenir l'identité de l'id de l'utilisateur (connecté par AWS Cognito) qui a appelé une AWS Lambda fonction? Dois-je utiliser le SDK de la fonction Lambda pour obtenir l'identité id?
Parlez-vous Cognito sync comme une source de l'événement? Il devrait être disponible à l'événement dans le
Dans ce cas, je suis à l'aide du SDK Javascript sur le navigateur. de l'événement.Les enregistrements ne semble pas être disponible dans ce cas.
Ahh, l'a obtenu. Pensais que vous parliez de Cognito source de l'événement au lieu de l'authentification avec Cognito.
event.Records[0].cognitosync.identityId
.Dans ce cas, je suis à l'aide du SDK Javascript sur le navigateur. de l'événement.Les enregistrements ne semble pas être disponible dans ce cas.
Ahh, l'a obtenu. Pensais que vous parliez de Cognito source de l'événement au lieu de l'authentification avec Cognito.
OriginalL'auteur Renan | 2015-04-28
Vous devez vous connecter pour publier un commentaire.
Par les docs, ça ressemble à des informations sur l'identité d'un fournisseur ne sera disponible que pour une invoquer à travers le Mobile SDK.
Pour contourner ce problème, une seule option est de passer à l'identité de l'ID de la fonction manuellement dans le cadre de l'événement. En supposant que vous faites quelque chose comme
AWS.config.credentials = new AWS.CognitoIdentityCredentials(...)
alors vous devriez être en mesure d'obtenir l'ID viaAWS.config.credentials.identityId
(après les informations d'identification sont actualisés).MODIFIER: UNE meilleure option pour la validation de l'identité, c'est de laisser Cognito/IAM de la poignée, et de supposer que si un utilisateur peut invoquer avec succès une fonction Lambda, ce qui signifie qu'ils sont autorisés à. Dans ce cas, pour gérer par la validation de l'utilisateur, prendre un coup d'oeil à la liste blanche.
Hmm...mais la seule façon qu'un utilisateur devrait être en mesure d'appeler votre fonction est de savoir si ils ont un "valide" de l'identité. Votre Cognito piscine définit le contrat que vous attendez, par exemple, si vous voulez être connecté avec Facebook en premier, ou vous pouvez même avoir vos propres méthodes de validation personnalisé dans un fournisseur d'identité. Si la fonction Lambda ne devrait pas besoin de s'inquiéter à propos de la validation. Mais je sens que je suis absent quelque chose ici...ce cas, voyez-vous où vous auriez besoin de les valider dans la fonction Lambda?
par exemple: si je veux appeler une fonction pour créer/modifier/supprimer quelque chose, dire sur DynamoDB, mais j'ai pour valider l'utilisateur de s'assurer qu'il dispose de l'autorisation pour ce faire.
Blanche? Ou la solution plus appropriée pour ce cas qui est un fournisseur personnalisé. À mon humble avis Cognito/IAM/de votre application doit prendre soin de validation et une fois qu'un utilisateur appelle une fonction qui signifie qu'ils sont autorisés à.
Les docs sont malheureusement un peu trompeur dans ce cas. L'identité doit être disponible, que le SDK utilisé, aussi longtemps que les informations d'identification sont venus de une Amazon Cognito authflow.
OriginalL'auteur William Gaul
Dans AWS SDK javascript à l'intérieur d'une fonction lambda suffit d'utiliser
contexte.l'identité.cognitoIdentityId
Il travaille pour moi
Je suis en train de faire cela, mais dans une fonction java donc c'est le contexte.getIdentity().getIdentityId() et elle retourne une chaîne vide. Si je me connecte contexte.getIdentity (), elle renvoie 'lambdainternal.api.LambdaCognitoIdentity@42f48531'. Des idées?
Je suis vraiment curieux de savoir: Que faites-vous pour obtenir cela? Quelles sont les particularités de config que tu fais avec Lambda ou de la Passerelle API?
Je soupçonne @JamesParker est accidentellement à l'aide de non authentifié
CognitoIdentityCredentials
, ce qui est beaucoup trop facile avec l'exemple de docs pour l'utilisation du navigateur.Comment tester cela en utilisant le FACTEUR... Lorsque la demande est à envoyer à l'aide du facteur, lambda est d'avoir la valeur null pour l'événement.requestContext.l'identité.cognitoAuthenticationProvider
OriginalL'auteur user966391
Si vous allez par le biais de la Passerelle API, vous pouvez passer à la cognito (id de l'utilisateur arn et d'autres informations utiles) pour Lambda. Cela a résolu le problème pour moi.
http://docs.aws.amazon.com/apigateway/latest/developerguide/api-gateway-mapping-template-reference.html
La passerelle API, nous avons ajouté la cognito d'authentification. Dans l'api ajout de la méthode "$contexte.l'identité.cognitoIdentityPoolId" mais il est vide quand on y accède en JAVA d'une fonction lambda. nous en utilisant le facteur de la clientèle et de définir jeton d'Autorisation. ce qui est absent ?
Si vous ajoutez quelque chose comme
Authorization: Bearer SOME_TOKEN
où SOME_TOKEN est l'Id ou Auth jeton retournée parInitiateAuth
/RespondToAuthChallenge
de flux, de vous authentifier à l'aide d'un Cognito Utilisateur de la Piscine, et, par conséquent, n'ont pas encore une identité id de pool. Les commentaires ne sont pas assez grands pour décrire les flux complets ici :), mais vous voulez être de l'authentification avecCognitoIdentityCredentials
, qui utilise STS sous le capot pour obtenir un accès temporaire clés qui vont ensemble.OriginalL'auteur Stephen
Si quelqu'un d'autre tombe sur ce, je pense que cela va vous aider beaucoup.
Note cela s'applique uniquement si vous utilisez le Cognito Utilisateur Piscine Approbateur. Si vous souhaitez utiliser AWS_IAM avec Cognito Identitys découvrez mon github exemple https://github.com/VictorioBerra/js-cognito-auth-example (lire en bas de la zone de montage ci-dessous)
Si vous avez "l'Utilisation Lambda Proxy Intégration" est cochée alors vous n'aurez pas accès à de Modèle de Demande de Mappings. Mais vous pouvez faire les demandes à l'intérieur du jeton dans votre fonction lambda:
EDITION - Plus d'informations pour l'utilisation de AWS_IAM comme APIG approbateur
Fondamentalement, vous devez avoir votre APIG sécurisé avec AWS_IAM ET vous devez auth via un Cognito Identité Fédérée qui sera de retour une sessionToken exemple d'utilisation de l'utilisateur piscines. C'est ce qui rend l'AWS IAM informations d'identification temporaire. Maintenant vous avez tout ce dont vous avez besoin pour auth pour votre APIG.
Pour tester cela, téléchargez la version de bureau de postman, mélanger dans votre API URI (grab cette de la les stades de la zone) et ensuite, en vertu de l'Autorisation de remplir le 5 champs dont vous avez besoin pour Sig4 signature. Vous verrez de l'événement.l'identité de l'objet dans votre fonction lambda est chargé avec des propriétés telles que la
user
objet.Si vous souhaitez utiliser l'APIG auto-généré SDK, il est intégré dans une usine qui prend la
accessKey
,secret
, ettoken
et les signes de tout pour vous. Même avec l'aws sdk. Vous pouvez initialiser les informations d'identification avec ces trois éléments, et il signera automatiquement toutes les demandes pour vous avec ces temp creds. Si vous voulez tout droit jusqu'manuellement frapper votre API avec fenêtre.chercher, demander, curl, (insérer le client http ici), vous pouvez calculer votre propre Sig4 (attention, il peut être un peu compliqué ou l'utilisation d'une bibliothèque moderne pour le faire pour vous.Également pour l'enregistrement, tout en faisant mes recherches, j'ai remarqué que si vous ne voulez PAS utiliser AWS_IAM comme un APIG approbateur, et que vous voulez utiliser "Cognito Identité du Pool d'Autorisateur" qui est une fantaisie nouvelle option dans la liste déroulante dans l'APIG vous pouvez toujours obtenir une tonne d'info sur l'utilisateur dans le lambda de l'événement si vous venez de passer le JWT acquise en cas de réussite Cognito popl auth à l'APIG que l'en-tête d'Autorisation. L'intérieur que JWT est beaucoup de attributs que vous pouvez personnaliser à votre piscine paramètres.
Professionnelle IMO avis, je pense que l'aide de la AWS_IAM temp creds approbateur est préféré. De cette façon, vous pouvez utiliser autant de personnes déplacées que vous le souhaitez dans Cognito Identités (Facebook, Twitter, piscines, etc.)
Merci Simon j'ai mis à jour ma réponse. J'ai passé un certain temps à travailler sur cette question et a créé un projet github.
de l'événement.requestContext.approbateur n'est pas disponible dans mon lambda. En cours d'exécution avec AWS_IAM et "Lambda Proxy de l'Intégration". Des idées? Remarque: Cognito & IAM sont le pur enfer. WAAAY complexes.
si vous n'avez pas
authorizer
les chances sont que vous r'appel à votre APIG n'était pas authed. Fondamentalement, vous devez avoir votre APIG sécurisé avec AWS_IAM ET vous devez auth via un Cognito Identité Fédérée qui sera de retour une sessionToken.J'ai fait tout cela et de son authed. Mais selon les docs de l'approbateur est en fait pas là pour ce scénario. Je pense que c'est là seulement pour USERPOOL approbateur. Vous pouvez obtenir de l'Identité via un événement.requestContext.l'identité.cognitoAuthenticationProvider . Malheureusement, seul le "sous" l'attribut de l'utilisateur dans la piscine. Pas d'autres champs.
OriginalL'auteur Victorio Berra
Mon constat est le suivant.
Si vous appelez la Passerelle API avec une Demande signée où vous avez réellement fournir les accesskey, secret et sessionToken que vous pouvez extraire via JS (SDK):
Et supposé que votre lambda est appelée à partir de l'API Gateway via LAMBDA_PROXY et Approbateur AWS_IAM. Vous pouvez seulement de l'accès de l'utilisateur stuff lambda:
Ensuite, vous aurez, entre autres choses, le "sub" de la cognito UserPool de l'Utilisateur. Donc, si vous voulez vraiment en savoir plus sur l'utilisateur, il semble que vous devez demander à AWS via SDK appel.
OriginalL'auteur Marc