web-dev-qa-db-fra.com

Qu'est-ce que l'API REST (ou CLI) pour se connecter aux pools d'utilisateurs Amazon Cognito

Comment puis-je effectuer les connexions via Amazon Cognito REST (pour les pools d'utilisateurs) sur les plateformes pour lesquelles il n'y a pas de SDK officiel? - Notez que je demande des pools d'utilisateurs - pas des pools d'identités.


Synopsis


Amazon cognito propose 3 types de connexions:

  • connexions fédérées (crée pools d'identité) - en utilisant des connexions sociales comme FB, Twitter, G + etc.
  • Connexions gérées par AWS (crée pools d'utilisateurs) - en utilisant la propre inscription gérée d'Amazon, la connexion, le mot de passe oublié, la réinitialisation des services de mot de passe
  • les connexions fournies par le développeur (mon service d'authentification personnalisé géré par moi-même)

J'utilise le second (avec les pools d'utilisateurs)


Amazon cognito possède plusieurs SDK pour Android, iOS, javascript, Xamarin, etc. Cognito fournit également REST API pour construire sur des plates-formes autres que celles prises en charge par les SDK officiels. Je construis une application pour une plate-forme différente et, par conséquent, REST est mon seul moyen car il n'y a pas SDK officiel pour ma plateforme.

L'API Cognito REST fournit différents points de terminaison pour ' inscrivez-vous', ' mot de passe oublié', ' confirmer la vérification 'etc, mais de manière surprenante, l'API REST n'a pas de point de terminaison pour la connexion/connexion simple.


De Documents API CLI Cognito J'ai toutes les API CLI OFFICIELLES nécessaires pour " inscrivez-vous", " confirmez les inscriptions", " changer les mots de passe "," vérifier les numéros de téléphone "," mots de passe oubliés "etc. Étonnamment, aucune API CLI n'est mentionnée pour les CONNEXIONS. J'espérais qu'il devrait y avoir une API CLI comme "$ aws cognito-idp log-in "comme pour" $ aws cognito-idp sign-up "ou pour" $ aws cognito-idp forgot-password "etc.


Aussi de ce tutoriel de démarrage il parle de "* ce qui devrait être fait avec les jetons reçus [~ # ~] après [~ # ~] authentification réussie d'un utilisateur * ". Cependant, il ne parle pas de COMMENT FAIRE rendre l'authentification réussie en premier lieu avec Cognito User Pool Apis. Les exemples ne sont disponibles que pour les SDK Android, iOS et javascript. Il n'y a pas d'exemples d'authentification disponibles pour les plates-formes qui n'ont pas de SDK.


Par conséquent, Comment puis-je effectuer les connexions via Amazon Cognito REST (pour les pools d'utilisateurs) sur les plateformes pour lesquelles il n'y a pas de SDK officiel?

24
Rakib

Mise à jour:

Comme vous l'avez souligné dans les commentaires ci-dessous, le flux d'authentification est documenté ici: http://docs.aws.Amazon.com/cognito/latest/developerguide/Amazon-cognito-user-pools-authentication-flow. html . Cela pourrait aider à clarifier le flux d'authentification

C'est quelque peu contre-intuitif, mais cela a du sens pour les applications mobiles où vous ne voulez pas que l'utilisateur se connecte explicitement, mais transportez plutôt des jetons pour l'utilisateur. Notez qu'il existe une API de connexion explicite (connexion) dans le SDK AWS Userpools pour iOS. Je ne l'ai pas utilisé, mais je suppose que c'est juste une autre API côté client pour passer par le même InitiateAuth() suivi d'un RespondToAuthChallenge() flux. L'exemple de connexion iOS est documenté ici - Exemple de SDK IOS: connexion d'un utilisateur

Message d'origine:

La documentation de l'API Cognito User Pools pour lancer l'authentification est disponible ici

La façon dont cela fonctionne devient plus claire si vous implémentez une application de pools d'utilisateurs dans l'un des SDK (j'en ai fait une dans Swift pour iOS, elle est clarifiée car la journalisation des réponses JSON est verbeuse et vous peut en quelque sorte voir ce qui se passe si vous regardez dans le journal).

Mais en supposant que je comprends votre question: En résumé, vous devriez InitiateAuth() et la réponse à cela (du serveur Cognito User Pools) est un défi. Ensuite, vous faites RespondToAuthChallenge() (également documenté dans ce document API) et la réponse à cela est un résultat d'authentification - en supposant que le mot de passe/session/token a été accepté.

La combinaison de ces deux choses est, je crois, ce que vous appelez LOGIN, et cela fonctionne comme une connexion. Dans les API, la façon dont il est configuré est que les tentatives pour obtenir des informations sur les utilisateurs lorsque l'utilisateur n'est pas authentifié déclenchent que InitiateAuth() et (dans iOS de toute façon) l'API rappelle le code que vous écrivez pour demander pour les mots de passe, et envoyer une demande RespondToAuthChallenge() etc.

8
Bruce0

Cette commande curl fonctionne pour moi:

curl -X POST --data @aws-auth-data.json \
-H 'X-Amz-Target: AWSCognitoIdentityProviderService.InitiateAuth' \
-H 'Content-Type: application/x-amz-json-1.1' \
https://cognito-idp.us-east-1.amazonaws.com/

Où aws-auth-data.json est:

{
   "AuthParameters" : {
      "USERNAME" : "[email protected]",
      "PASSWORD" : "yourpassword"
   },
   "AuthFlow" : "USER_PASSWORD_AUTH",
   "ClientId" : "75........................"
}

Le client du pool d'utilisateurs doit autoriser USER_PASSWORD_AUTH pour que cela fonctionne - c'est un paramètre côté AWS.

34
andrewjj

L'un des développeurs de l'équipe AWS Cognito ici.

Pour ajouter à @ md-abdul-munim's answer , nous vous recommandons d'utiliser l'un des SDK côté client. Si vous créez une API REST puis une interface frontale qui communique avec ces API, il est préférable d'intégrer simplement Cognito à partir de votre interface frontale.

Si vous devez absolument utiliser Cognito à partir d'un serveur principal, les API d'authentification seront disponibles avec notre version GA. Dans nos pools d'utilisateurs Cognito, l'authentification de version bêta est uniquement disponible via les SDK clients.

1
Chetan Mehta

D'après ce que vous avez discuté, je considère que vous essayez de le faire à partir d'une interface Web. Parce que cognito vous fournit le support backend nécessaire et s'attend à ce que vous communiquiez (par exemple, authentifiez-vous, inscrivez-vous, etc.) à partir d'une couche de présentation - c'est pourquoi vous avez trouvé des SDK pour différentes plates-formes mobiles. Ils ont également un SDK pour l'application Web - l'accès est disponible via leur SDK Javascript.

Voici un tutoriel détaillé pour réaliser ce que vous avez demandé à partir d'une interface Web à l'aide de leur SDK JS- Accès à vos groupes d'utilisateurs à l'aide du SDK Amazon Cognito Identity pour JavaScript

0
Munim Dibosh

J'ai un problème similaire et je me demandais comment intégrer Cognito dans un backend Elixir et j'ai trouvé cette bibliothèque: https://github.com/aws-beam/aws-elixir

D'après ce que je peux comprendre en lisant son code source, ils font finalement une demande POST qui contient l'en-tête "X-Amz-Target": "AWSCognitoIdentityProviderService.#{name_of_api_action}" (c'est ici: https://github.com/aws-beam/aws-elixir/blob/master/lib/aws/cognito_identity_provider.ex#L564 ). C'est sans les en-têtes d'autorisation, ils sont ajoutés ailleurs, mais je l'ai trouvé intéressant. Les fonctions qui construisent l'URL de la demande sont les suivantes, vous devriez donc pouvoir vous faire une idée du point de terminaison qui est appelé.

Je dois dire que j'ai essayé de suivre cet article écrit en japonais - https://qiita.com/yujikawa/items/e79929ed14277102f4b8 , et je n'ai pas réussi à le faire fonctionner, peut-être parce que je ne savais pas trop quoi la variable d'environnement AWS_ENDPOINT appropriée doit être. Je pense actuellement à essayer le SDK Ruby, à en juger par la documentation, cela semble correct. Mais, néanmoins, ces informations peuvent encore aider quelqu'un.

0
Nikolay D