AWS CognitoをOpenId接続プロバイダーとして使用します。AWScognito IDPは、ユーザーを認証するために別のOpenIdプロバイダーをインターン呼び出します。次に、新しいトークンを作成し、独自のトークンとして呼び出し元に渡します。
AWS cognitoプールで内部的に使用されるOpenIDプロバイダーは、ユーザーに対して透過的です。ユーザーはAWS cognitoをIDPプロバイダーとしてのみ設定します。
ユーザー事例
質問
Cognitoは、この ブログ投稿 by @ Badri で詳しく説明されているように、OpenId接続エンドポイントを提供します。
権限の式は次のとおりです。
https://cognito-idp.{region}.amazonaws.com/{userPoolId}
そして、何かがあることをメタデータURLで確認することで確認できます
https://cognito-idp.{region}.amazonaws.com/{userPoolId}/.well-known/openid-configuration
その後、クライアントプールのセットアップ中に、他のOIDCプロバイダーとフェデレーションを行い、アプリのクライアント設定でOIDCプロバイダーを有効にすることもできます。これにより、私がやりたいことと非常によく似たシナリオが可能になります。ただし、ブログの投稿では、アプリ統合のためのドメイン名の設定という重要な設定が1つ欠落しています。 このStackOverflowの質問 は、このドメインと回答へのソリューションへのリンクを設定しない場合に受け取るエラーを示しています。ドメインを設定すると、Badriのコードが機能しました。
CognitoのOpenID Connectサポートに関する詳細な回答を提供します。
Cognitoは、 https://openid.net/specs/openid-connect-discovery-1_0.html#ProviderConfigurationRequest で説明されているように、次の場所でOpenID Connect Discoveryエンドポイントを公開します。
https://cognito-idp.{region}.amazonaws.com/{userPoolId}/.well-known/openid-configuration
上記のエンドポイントは、次の3つのresponse_typeを返します。
"response_types_supported":["code","token","token id_token"]
コード: https://tools.ietf.org/html/rfc6749#section-11.3.2 で定義-これは機能しましたが、ドメインが以下のように指定された場合のみ。
トークン:この値は、OpenID Connectで https://openid.net/specs/openid-connect-core-1_0.html#ImplicitAuthRequest -"NOTE :OAuth 2.0は暗黙フローのトークン応答タイプ値も定義しますが、IDトークンが返されないため、OpenID Connectはこの応答タイプを使用しません。 "-OpenID Connectライブラリこの応答は無視されます。
トークンid_token:この値は、コード「invalid_request」でエラーページへのリダイレクトをトリガーします。リクエストで何が無効であるかについての表示はありません。 AWSテクニカルサポートは、「コード」と「トークン」のみが認証エンドポイントでサポートされていると主張していますが、サポートされていない場合にこのresponse_typeがアドバタイズされる理由は明らかではありません。
Cognitoは、Cognitoエンドポイントのホスト名にプレフィックスを付けるドメインを指定するオプションを提供します。
ドメインが指定されていない場合、Cognitoは https://cognito-idp.eu-west-2.amazonaws.com/ {などのOpenID Connectディスカバリエンドポイントで汎用URLをアドバタイズしますuserPoolId}/authorize、ただしこれらのURLでのログイン試行はすべてエラーメッセージを返します。
{"code":"BadRequest","message":"The server did not understand the operation that was requested.","type":"client"}
エラーメッセージはリクエストの何が悪いのかを示していないため、これはCognitoのバグのようです。
ドメインを指定すると、Cognitoはドメインプレフィックスを含むURLをアドバタイズし、response_type "code"は期待どおりにログインページを返します。
https://openid.net/specs/openid-connect-session-1_0.html#RPLogout のOpenID Connectセッション管理では、OpenID Connectログアウトを開始する方法と必要な方法について説明しています https://openid.net/specs/openid-connect-session-1_0.html#OPMetadata に従って、end_session_endpointパラメーターがディスカバリーメタデータに含まれていること。
Cognitoの場合、end_session_endpointはメタデータから省略されます。
https://openid.net/specs/openid-connect-session-1_0.html#RPLogout でのRPからのログアウトでは、ログアウトエンドポイントの動作について説明しています。ログアウトエンドポイントをOpenID Connectクライアント実装に手動で渡そうとすると、ログアウトは次のように失敗します。
{"code":"BadRequest","message":"The server did not understand the operation that was requested.","type":"client"}
繰り返しますが、エラーメッセージはエラーを示しませんが、ログアウトエンドポイントの説明 https://docs.aws.Amazon.com/cognito/latest/developerguide/logout-endpoint.html OpenID Connectとの互換性はありません。
OpenID Connectを使用してCognitoにログインできますが、ログアウトするオプションはありません。
Cognito Cloudformationのサポートは不完全であり、次のようにOpenID Connectに影響します。
OpenID Connectを使用してCognitoにアクセスするには、ドメインが指定されていることを確認し、response_type "code"のみを使用してください。 OpenID Connectのログアウトはできません。他のオプションはOpenID Connect仕様に違反しているか、リリースされていません。
ユースケースを追跡するのに少し苦労していますが、役立つかもしれないいくつかのポイントを説明します。
Cognitoユーザープールを使用して、Googleを介してユーザーを認証し、CognitoユーザープールからJWTトークンを発行できます。 開発者ガイド を参照してください。
Cognito User Poolsは現在、完全なOpenID IDプロバイダーではありませんが、ロードマップに記載されています。ユーザープールはOAuth2.0フローをサポートし、OpenID標準JWTトークンを提供します。