web-dev-qa-db-fra.com

Puis-je utiliser AWS cognito pour fournir un point de terminaison de connexion à identifiant ouvert?

Je souhaite utiliser AWS cognito en tant que fournisseur de connexion OpenId. Mon IDP AWS cognito appellera en interne mon autre fournisseur OpenId pour authentifier l'utilisateur. Il créera ensuite son nouveau jeton et le remettra aux appelants comme le sien.

Le fournisseur OpenID utilisé en interne par AWS cognito pool est transparent pour l'utilisateur. L'utilisateur configure uniquement AWS cognito en tant que fournisseur IDP.

Cas d'utilisation

  • L'utilisateur s'authentifie auprès de mon fournisseur ID AWS
  • Mon fournisseur IDP authentifie l'utilisateur auprès du fournisseur IDP de Google
  • Mon IDP décode le jeton retourné par Google IDP.
  • Mon IDP crée un nouveau jeton et ajoute des revendications supplémentaires.
  • Mon IDP remet mon JWT à l'utilisateur.

Question

  • Est-ce possible dans AWS cognito?
  • Le pool d'utilisateurs AWS expose-t-il le point de terminaison de connexion OpenID?
19
user93796

Cognito fournit un point de terminaison de connexion OpenId, comme détaillé dans ce article de blog par @ Badri

La formule de l'autorité est la suivante:

https://cognito-idp.{region}.amazonaws.com/{userPoolId}

Et vous pouvez vérifier en vérifiant l'URL des métadonnées que quelque chose est là

https://cognito-idp.{region}.amazonaws.com/{userPoolId}/.well-known/openid-configuration

Ensuite, lors de la configuration du pool de clients, vous pouvez fédérer avec d'autres fournisseurs OIDC et également activer le fournisseur OIDC dans les paramètres du client d'application. Ce qui devrait permettre à votre scénario qui ressemble beaucoup à ce que je voudrais faire. Cependant, le billet de blog manque un élément de configuration crucial, qui consiste à définir un nom de domaine pour l'intégration de l'application. Cette question StackOverflow montre l'erreur que vous recevrez si vous ne configurez pas ce domaine et établit un lien vers la solution dans une réponse. Une fois que j'ai défini le domaine, le code de Badri a fonctionné pour moi.

13
Jim Counts

Pour donner une réponse plus détaillée sur le support OpenID Connect de Cognito.

Point de terminaison de découverte

Cognito expose un point de terminaison OpenID Connect Discovery comme décrit à https://openid.net/specs/openid-connect-discovery-1_0.html#ProviderConfigurationRequest à l'emplacement suivant:

https://cognito-idp.{region}.amazonaws.com/{userPoolId}/.well-known/openid-configuration

Types de réponse

Le point de terminaison ci-dessus renvoie les trois types de réponse suivants:

"response_types_supported":["code","token","token id_token"]
  • code: défini dans https://tools.ietf.org/html/rfc6749#section-11.3.2 - cela a fonctionné pour nous, mais uniquement lorsqu'un domaine a été spécifié comme ci-dessous.

  • jeton: cette valeur est interdite par OpenID Connect à https://openid.net/specs/openid-connect-core-1_0.html#ImplicitAuthRequest - "NOTE : Alors que OAuth 2.0 définit également la valeur du type de réponse du jeton pour le flux implicite, OpenID Connect n'utilise pas ce type de réponse, car aucun jeton d'ID ne sera retourné. " - Les bibliothèques OpenID Connect ignoreront cette réponse.

  • token id_token: cette valeur déclenche une redirection vers une page d'erreur avec le code "invalid_request". Rien n'indique ce qui n'est pas valide avec la demande. Le support technique AWS affirme que seuls "le code" et le "jeton" sont pris en charge par le point de terminaison d'autorisation, il n'est cependant pas clair pourquoi ce type de réponse est annoncé s'il n'est pas pris en charge.

Domaine

Cognito donne la possibilité de spécifier un domaine qui préfixera le nom d'hôte du point de terminaison Cognito.

Sans spécification de domaine, Cognito publiera des URL génériques sur le point de terminaison de découverte OpenID Connect, telles que https://cognito-idp.eu-west-2.amazonaws.com/ {userPoolId}/authorize, mais toutes les tentatives de connexion à ces URL renvoient le message d'erreur:

{"code":"BadRequest","message":"The server did not understand the operation that was requested.","type":"client"}

Le message d'erreur n'indique pas ce qui est mauvais dans la demande, il semble donc que ce soit un bogue dans Cognito.

Avec un domaine spécifié, Cognito publiera des URL qui incluent le préfixe de domaine et le "code" response_type renvoie une page de connexion comme prévu.

Se déconnecter

Gestion de session OpenID Connect sur https://openid.net/specs/openid-connect-session-1_0.html#RPLogout décrit comment une déconnexion OpenID Connect doit être initiée et requiert selon https://openid.net/specs/openid-connect-session-1_0.html#OPMetadata que le paramètre end_session_endpoint soit inclus dans les métadonnées de découverte.

Dans le cas de Cognito, end_session_endpoint est omis des métadonnées.

Déconnexion initiée par RP à https://openid.net/specs/openid-connect-session-1_0.html#RPLogout décrit le fonctionnement du point de terminaison de déconnexion. Si une tentative est faite pour transmettre manuellement le point de terminaison de déconnexion à l'implémentation du client OpenID Connect, la déconnexion échoue comme suit:

{"code":"BadRequest","message":"The server did not understand the operation that was requested.","type":"client"}

Encore une fois, le message d'erreur ne donne aucune indication de l'erreur, mais la description du point de terminaison de déconnexion à https://docs.aws.Amazon.com/cognito/latest/developerguide/logout-endpoint.html ne montre aucune compatibilité avec OpenID Connect.

Bien que vous puissiez vous connecter à Cognito à l'aide d'OpenID Connect, il n'y a pas d'option de déconnexion.

Cloudformation

La prise en charge de Cognito Cloudformation est incomplète et affecte OpenID Connect comme suit:

  • Il n'y a aucun moyen de spécifier un domaine à l'aide de Cloudformation, et le domaine est requis pour que OpenID Connect fonctionne.
  • L'URL de rappel est requise par OpenID Connect, mais ne peut pas être définie à l'aide de Cloudformation.

Sommaire

Pour accéder à Cognito à l'aide d'OpenID Connect, assurez-vous qu'un domaine est spécifié et utilisez uniquement le "code" response_type. La déconnexion d'OpenID Connect n'est pas possible. D'autres options violent la spécification OpenID Connect, ou ont été publiées cassées.

3
Graham Leggett

J'ai un peu de mal à suivre votre cas d'utilisation, mais je vais vous expliquer quelques points qui pourraient vous aider.

Vous pouvez utiliser les groupes d'utilisateurs Cognito pour authentifier les utilisateurs via Google, puis émettre des jetons JWT à partir du groupe d'utilisateurs Cognito. Voir le Guide du développeur .

Cognito User Pools n'est pas actuellement un fournisseur d'identité OpenID complet, mais c'est sur notre feuille de route. Les pools d'utilisateurs prennent en charge les flux OAuth2.0 et fournissent des jetons JWT standard OpenID.

2
user3349035