2017-02-01 6 views
0

J'ai une application côté client (développée en Java, pas Android) qui authentifie un utilisateur avec un pool d'utilisateurs Amazon Cognito. Pour clarifier les choses: cette application affiche une boîte de dialogue d'entrée de nom d'utilisateur/mot de passe, puis s'authentifie auprès du service de pool d'utilisateurs Cognito à l'aide de la méthode SRP; les défis potentiels sont traités dans cette boîte de dialogue (identifiant de l'appareil, mot de passe doit être changé, deux facteurs, etc). À la fin, j'ai une série de jetons qui permettent au programme d'utiliser les services AWS avec les informations d'identification de l'utilisateur.Amazon Cognito: comment transmettre des informations d'identification à une application côté serveur

Maintenant, j'ai besoin de l'application cliente pour communiquer avec une application côté serveur personnalisée. Le client devra prouver son identité à l'application serveur, qui communiquera alors avec plus de services AWS. Ici, j'ai deux cas d'utilisation distincts:

1) Le serveur doit seulement connaître qui est l'utilisateur authentifié par le client (de manière sûre, mais sans usurper l'identité de l'utilisateur).

2) Le client doit déléguer certains ou tous les privilèges de l'utilisateur au serveur; le serveur effectuera alors certaines actions sur les services AWS sous ce nom d'utilisateur.

L'application côté serveur sera probablement développée en Java, fonctionnant sur une machine EC2. Je m'intéresse uniquement à l'authentification des utilisateurs via la source de pool d'utilisateurs Cognito (c'est-à-dire que je ne suis pas intéressé par les flux d'authentification basés sur Facebook/Google/OpenID).

Il semble assez facile d'atteindre les deux objectifs de manière très dangereuse: il suffit que l'application cliente envoie au serveur tous les jetons qui lui ont été attribués. Mais ce n'est évidemment pas le chemin à parcourir.

Cependant, j'ai de la difficulté à trouver dans la documentation de Cognito User Pool/Cognito Identity Pool/IAM/STS comment cela peut être correctement réalisé. Je m'attendrais par exemple à ce que l'application cliente puisse générer une sorte de "jeton de délégation", qui peut être transmis au serveur; le serveur devrait alors être en mesure de valider ce jeton et d'en extraire des informations d'identité (satisfaisant # 1), ou d'emprunter l'identité correspondant au jeton afin d'effectuer des appels aux services AWS (satisfaisant # 2). Ou peut-être que je pense cela incorrectement?

Répondre

3

Ce que vous signalez est le flux d'octroi de code OAuth 2.0 qui n'est pas actuellement pris en charge par Amazon Cognito.

La méthode la plus sûre actuellement disponible consiste à transmettre le jeton d'identité du client au serveur, puis à valider ce jeton et à en extraire les informations d'identité. Cela prouve l'identité de l'appelant puisque vous pouvez valider la signature du jeton d'identité.

+1

J'avais un faible souvenir que OAuth 2 avait un flux spécifique à cet effet, bien que je ne me souvenais pas du nom de celui-ci. Merci de le signaler. Maintenant, n'est-il pas risqué de partager le jeton d'identité du client au serveur? Bien sûr que je peux le passer sur SSL, mais quand même ... Quel serait le risque potentiel de divulgation? Il est évident que quelqu'un pourrait usurper l'identité de l'utilisateur en ce qui concerne mon serveur spécifique, mais serait-il possible de faire plus que cela? – jwatkins