

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

# エンタープライズアプリケーションの Amazon Cognito 認証フローを選択する
<a name="choose-an-amazon-cognito-authentication-flow-for-enterprise-applications"></a>

*Michael Daehnert、Fabian Jahnke (Amazon Web Services)*

## 概要
<a name="choose-an-amazon-cognito-authentication-flow-for-enterprise-applications-summary"></a>

[Amazon Cognito](https://docs.aws.amazon.com/cognito/latest/developerguide/what-is-amazon-cognito.html) は、ウェブおよびモバイルアプリの認証、認可、およびユーザー管理機能を提供します。フェデレーティッド ID の認証向けに、便利ないくつもの機能を提供します。これを稼働させるために、テクニカルアーキテクトは各機能の使用方法を決定する必要があります。

Amazon Cognito は、認証リクエストの複数のフローをサポートしています。これらのフローは、ユーザーが ID を検証する方法を定義するものです。どの認証フローを使用するかの決定は、アプリケーションの特定の要件によって異なり、複雑になることもあります。このパターンは、エンタープライズアプリケーションに最適な認証フローを決定するのに役立ちます。Amazon Cognito、OpenID Connect (OIDC)、フェデレーションに関する基本的な知識が既にあることを前提として、さまざまなフェデレーション認証フローの詳細を説明します。

このソリューションは、技術的な意思決定者を対象としています。さまざまな認証フローを理解し、各フローをアプリケーション要件にマッピングするのに役立ちます。テクニカルリードは、Amazon Cognito の統合を開始するために必要なインサイトを収集する必要があります。エンタープライズ組織は主に SAML フェデレーションに焦点を当てているため、このパターンでは SAML フェデレーションを使用する [Amazon Cognito ユーザープール](https://docs.aws.amazon.com/cognito/latest/developerguide/cognito-user-identity-pools.html)についても説明します。

## 前提条件と制限事項
<a name="choose-an-amazon-cognito-authentication-flow-for-enterprise-applications-prereqs"></a>

**前提条件**
+ アクティブな AWS アカウント
+ AWS Identity and Access Management (IAM) ロール、および Amazon Cognito へフルアクセスできる権限
+ (オプション) Microsoft Entra ID、Active Directory フェデレーションサービス (AD FS)、Okta などの ID プロバイダー (IdP) へのアクセス
+ 使用するアプリケーションに関する高度な専門知識
+ Amazon Cognito、OpenID Connect (OIDC)、フェデレーションの基本知識

**制限事項**
+ このパターンは、Amazon Cognito ユーザープールと ID プロバイダーに焦点を当てています。Amazon Cognito ID プールの詳細については、「[追加情報](#choose-an-amazon-cognito-authentication-flow-for-enterprise-applications-additional)」セクションを参照してください。

## アーキテクチャ
<a name="choose-an-amazon-cognito-authentication-flow-for-enterprise-applications-architecture"></a>

次の表は、認証フローの選択に役立ちます。各フローについては、このセクション内で詳しく説明します。


| 
| 
| マシン間の認証が必要ですか? | 対象アプリケーションは、フロントエンドがサーバー側でレンダリングされる、ウェブベースのアプリケーションですか? | 対象アプリケーションは、シングルページアプリケーション (SPA) またはモバイルベースのフロントエンドアプリケーションですか? | 対象アプリケーションには、「サインインしたままにする」機能の更新トークンが必要ですか? | フロントエンドはブラウザベースのリダイレクトメカニズムを提供しますか? | 推奨される Amazon Cognito フロー | 
| --- |--- |--- |--- |--- |--- |
| はい | なし | なし | なし | 不可 | クライアント認証情報フロー | 
| 不可 | あり | なし | はい | はい | 認可コードフロー | 
| いいえ | なし | はい | はい | はい | Proof Key for Code Exchange (PKCE) を使用した認可コードフロー | 
| いいえ | なし | なし | なし | 不可 | リソース所有者のパスワードフロー\* | 

\* リソース所有者のパスワードフローは、どうしても必要となる場合にのみ使用してください。詳細については、このパターンの「*リソース所有者のパスワードフロー*」セクションを参照してください。

**クライアント認証情報フロー**

クライアント認証情報フローは、Amazon Cognito フローの中で最も短いフローです。システムまたはサービスが、ユーザーを仲介させずに相互に通信する場合に使用します。リクエスト元のシステムは、クライアント ID とクライアントシークレットを使用してアクセストークンを取得します。どちらのシステムもユーザーとのやり取りなしで動作するため、追加の同意ステップは必要ありません。

![Amazon Cognito のクライアント認証情報フロー](http://docs.aws.amazon.com/ja_jp/prescriptive-guidance/latest/patterns/images/pattern-img/7b5e567c-66a4-4386-a1f6-616ed77a6211/images/1138745d-69fa-4ecc-a9ec-c0b2a68ce7d2.png)


この図は、以下を示すものです。

1. アプリケーション 1 は、クライアント ID とクライアントシークレットを含む認証リクエストを Amazon Cognito エンドポイントに送信し、アクセストークンを取得します。

1. これ以降、アプリケーション 1 は、アプリケーション 2 への呼び出しごとにこのアクセストークンを使用します。

1. アプリケーション 2 は、Amazon Cognito を使用してアクセストークンを検証します。

このフローは、以下の状況で使用する必要があります。
+ ユーザーとのやり取りのないアプリケーション間の通信

以下の状況では、このフローを使用しないでください。
+ ユーザーとのやり取りが発生する可能性のある通信

**認可コードフロー**

認可コードフローは、従来のウェブベースの認証用です。このフローでは、すべてのトークン交換とストレージがバックエンドで処理されます。ブラウザベースのクライアントには、実際のトークンは表示されません。このソリューションは、.NET Core、Jakarta Faces、Jakarta Server Pages (JSP) などのフレームワークで記述されたアプリケーションに使用されます。

認可コードフローはリダイレクトベースのフローです。クライアントは、ウェブブラウザまたは同様のクライアントとやり取りできる必要があります。クライアントは認証サーバーにリダイレクトされ、このサーバーに対して認証されます。クライアントが正常に認証されると、サーバーにリダイレクトされます。

![Amazon Cognito の承認コードフロー](http://docs.aws.amazon.com/ja_jp/prescriptive-guidance/latest/patterns/images/pattern-img/7b5e567c-66a4-4386-a1f6-616ed77a6211/images/1008296c-d5b8-449d-99d4-f0b2b7cf5d80.png)


この図表は、以下を示すものです:

1. クライアントがリクエストをサーバーに送信します。

1. ウェブサーバーは HTTP 302 ステータスコードを使用して、クライアントを Amazon Cognito にリダイレクトします。クライアントはこのリダイレクトに自動的に従い、設定済みの IdP ログインを実行します。

1. IdP 側では、IdP が既存のブラウザセッションの有無を確認します。存在しない場合、ユーザーはユーザー名とパスワードを入力して認証を受けるように促されます。IdP は Amazon Cognito への応答として、SAML トークンを提供します。

1. Amazon Cognito は成功の場合、JSON ウェブトークン (JWT)、特にコードトークンを返します。ウェブサーバーは /oauth2/token を呼び出して、コードトークンをアクセストークンと交換します。ウェブサーバーは検証のため、クライアント ID とクライアントシークレットを Amazon Cognito に送信します。

1. これ以降、他のアプリケーションへの呼び出しのつど、アクセストークンが使用されます。

1. 他のアプリケーションも、Amazon Cognito でアクセストークンを検証します。

このフローは、以下の状況で使用する必要があります。
+ ユーザーがウェブブラウザまたはクライアントとやり取りできる場合。ブラウザ上でシークレットが公開されないように、アプリケーションコードはサーバー側で実行およびレンダリングされます。

以下の状況では、このフローを使用しないでください。
+ 単一ページのアプリケーション (SPA) またはモバイルアプリケーションの場合は、レンダリングがクライアント側で行われるため、クライアントシークレットを使用しないでください。

**PKCE を使用した認可コードフロー**

単一ページのアプリケーションとモバイルアプリケーションには、Proof Key for Code Exchange (PKCE) を使用した認可コードフローを使用する必要があります。これは暗黙的なフローの後継であり、PKCE を使用するため、より安全です。PKCE は、パブリッククライアント向けの OAuth 2.0 認可コード付与の拡張機能です。PKCE は、傍受された認可コードの引き換えから保護します。

![Amazon Cognito の PKCE を使用した認可コードフロー](http://docs.aws.amazon.com/ja_jp/prescriptive-guidance/latest/patterns/images/pattern-img/7b5e567c-66a4-4386-a1f6-616ed77a6211/images/1609da4f-decd-4d43-afe0-31237238df6d.png)


この図表は、以下を示すものです:

1. アプリケーションがコード検証機能とコードチャレンジを作成します。これらは明確に定義された一意の値であり、今後の参照のために Amazon Cognito に送信されます。

1. アプリケーションが Amazon Cognito の /oauth2/authorization エンドポイントを呼び出します。これにより、設定された IdP ログイン画面に、ユーザーが自動的にリダイレクトされます。

1. IdP は既存のセッションの有無をチェックします。存在しない場合、ユーザーはユーザー名とパスワードを入力して認証を受けるように促されます。IdP は Amazon Cognito への応答として、SAML トークンを提供します。

1. 成功した場合、Amazon Cognito はコードトークンを返します。ウェブサーバーは /oauth2/token を呼び出して、コードトークンをアクセストークンと交換します。

1. これ以降、他のアプリケーションへの呼び出しのつど、アクセストークンが使用されます。

1. 他のアプリケーションは、Amazon Cognito でアクセストークンを検証します。

このフローは、以下の状況で使用する必要があります。
+ SPA またはモバイルアプリケーション

以下の状況では、このフローを使用しないでください。
+ アプリケーションのバックエンドで認証が処理される場合

**リソース所有者のパスワードフロー**

リソース所有者のパスワードフローは、リダイレクト機能のないアプリケーションを対象としています。このフローを構築するには、対象のアプリケーション内でログインフォームを作成します。ログインの実行は、リダイレクトフローに依存するのではなく、CLI または SDK 呼び出しを介して Amazon Cognito でチェックされます。フェデレーションにはブラウザベースのリダイレクトが必要なため、この認証フローではフェデレーションを実行できません。

![Amazon Cognito を使用したリソース所有者のパスワードフロー](http://docs.aws.amazon.com/ja_jp/prescriptive-guidance/latest/patterns/images/pattern-img/7b5e567c-66a4-4386-a1f6-616ed77a6211/images/d74bc596-08a3-40f4-a6a7-07f6610fe6b1.png)


この図表は、以下を示すものです:

1. ユーザーは、アプリケーションが提供するログインフォームに認証情報を入力します。

1. AWS コマンドラインインターフェイス (AWS CLI) は、Amazon Cognito に対して [admin-initiated-auth](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/cognito-idp/admin-initiate-auth.html) 呼び出しを行います。
**注記**  
または、AWS CLI の代わりに AWS SDK を使用することもできます。

1. Amazon Cognito はアクセストークンを返します。

1. これ以降、他のアプリケーションへの呼び出しのつど、アクセストークンが使用されます。

1. 他のアプリケーションは、Amazon Cognito でアクセストークンを検証します。

このフローは、以下の状況で使用する必要があります。
+ 保存された認証情報をアクセストークンに変換して、直接認証ロジック (基本アクセス認証やダイジェストアクセス認証など) を使用する既存のクライアントを OAuth に移行する場合

以下の状況では、このフローを使用しないでください。
+ フェデレーティッド ID を使用する場合
+ アプリケーションがリダイレクトをサポートしている場合

## ツール
<a name="choose-an-amazon-cognito-authentication-flow-for-enterprise-applications-tools"></a>

**AWS サービス**
+ [Amazon Cognito](https://docs.aws.amazon.com/cognito/latest/developerguide/what-is-amazon-cognito.html) は、ウェブおよびモバイルアプリの認証、認可、およびユーザー管理機能を提供します。

**その他のツール**
+ [JSON ウェブトークン (JWT) デバッガー](https://jwt.io/)は、ウェブベースの JWT 検証ツールです。

## エピック
<a name="choose-an-amazon-cognito-authentication-flow-for-enterprise-applications-epics"></a>

### アプリケーションを評価する
<a name="assess-your-application"></a>


| タスク | 説明 | 必要なスキル | 
| --- | --- | --- | 
| 認証要件の定義 | 特定の認証要件に従ってアプリケーションを評価します。 | アプリ開発者、アプリアーキテクト | 
| 要件を認証フローに合わせる | 「[アーキテクチャ](#choose-an-amazon-cognito-authentication-flow-for-enterprise-applications-architecture)」セクションで、フローの決定表とそれぞれの説明を参考にして、使用する Amazon Cognito 認証フローを選択します。 | アプリ開発者、AWS 全般、アプリアーキテクト | 

### Amazon Cognito ユーザープールの設定
<a name="set-up-the-amazon-cognito-user-pool"></a>


| タスク | 説明 | 必要なスキル | 
| --- | --- | --- | 
| ユーザープールの作成 | [See the AWS documentation website for more details](http://docs.aws.amazon.com/ja_jp/prescriptive-guidance/latest/patterns/choose-an-amazon-cognito-authentication-flow-for-enterprise-applications.html) | AWS 全般 | 
| (オプション) ID プロバイダーの設定 | [See the AWS documentation website for more details](http://docs.aws.amazon.com/ja_jp/prescriptive-guidance/latest/patterns/choose-an-amazon-cognito-authentication-flow-for-enterprise-applications.html) | AWS 全般、フェデレーション管理者 | 
| アプリケーションクライアントの作成 | [See the AWS documentation website for more details](http://docs.aws.amazon.com/ja_jp/prescriptive-guidance/latest/patterns/choose-an-amazon-cognito-authentication-flow-for-enterprise-applications.html) | AWS 全般 | 

### アプリケーションを Amazon Cognito に統合
<a name="integrate-the-application-with-amazon-cognito"></a>


| タスク | 説明 | 必要なスキル | 
| --- | --- | --- | 
| Amazon Cognito との統合の詳細をやり取りする | 認証フローに応じて、ユーザープール ID やアプリケーションクライアント ID などの Amazon Cognito 情報をアプリケーションと共有します。 | アプリ開発者、AWS 全般 | 
| Amazon Cognito 認証を実装する | この手順は、選択した認証フロー、プログラミング言語、使用しているフレームワークによって異なります。「[関連リソース](#choose-an-amazon-cognito-authentication-flow-for-enterprise-applications-resources)」セクションでは、手順を開始するためのいくつかのリンクを紹介しています。 | アプリ開発者 | 

## 関連リソース
<a name="choose-an-amazon-cognito-authentication-flow-for-enterprise-applications-resources"></a>

**AWS ドキュメント**
+ [User pool authentication flow](https://docs.aws.amazon.com/cognito/latest/developerguide/amazon-cognito-user-pools-authentication-flow.html)
+ [Verifying a JSON web token](https://docs.aws.amazon.com/cognito/latest/developerguide/amazon-cognito-user-pools-using-tokens-verifying-a-jwt.html)
+ [Access AWS services from an ASP.NET Core app using Amazon Cognito identity pools](https://docs.aws.amazon.com/prescriptive-guidance/latest/patterns/access-aws-services-from-an-asp-net-core-app-using-amazon-cognito-identity-pools.html?did=pg_card&trk=pg_card)
+ フレームワークと SDK:
  + [Amazon Amplify authentication](https://docs.amplify.aws/lib/auth/getting-started/q/platform/js)
  + [Amazon Cognito Identity Provider examples](https://docs.aws.amazon.com/sdk-for-java/latest/developer-guide/java_cognito-identity-provider_code_examples.html) (AWS SDK for Java 2.x documentation)
  + [Authenticating users with Amazon Cognito](https://docs.aws.amazon.com/sdk-for-net/v3/developer-guide/cognito-apis-intro.html) (AWS SDK for .NET documentation)

**AWS ブログ投稿**
+ [Authorization@Edge using cookies: Protect your Amazon CloudFront content from being downloaded by unauthenticated users](https://aws.amazon.com/blogs/networking-and-content-delivery/authorizationedge-using-cookies-protect-your-amazon-cloudfront-content-from-being-downloaded-by-unauthenticated-users/)
+ [Building AD FS Federation for your Web App using Amazon Cognito User Pools](https://aws.amazon.com/blogs/mobile/building-adfs-federation-for-your-web-app-using-amazon-cognito-user-pools/)

**実装パートナー**
+ [AWS Partners for authentication solutions](https://partners.amazonaws.com/search/partners?keyword=authentication)

## 追加情報
<a name="choose-an-amazon-cognito-authentication-flow-for-enterprise-applications-additional"></a>

**よくある質問**

*暗黙的なフローが廃止されるのはなぜですか?*

[OAuth 2.1 フレームワーク](https://oauth.net/2.1/)のリリース以降、暗黙的なフローはセキュリティ上の理由から非推奨としてマークされています。代わりの方法として、「[アーキテクチャ](#choose-an-amazon-cognito-authentication-flow-for-enterprise-applications-architecture)」セクションで説明している、PKCE を使用した認可コードフローを使用してください。

*必要な機能が Amazon Cognito によって提供されていない場合はどうしたらいいですか?*

AWS パートナーにより、認証および認可ソリューションに対するさまざまな統合機能が提供されています。詳細については、「[AWS Partners for authentication solutions](https://partners.amazonaws.com/search/partners?keyword=authentication)」を参照してください。

*Amazon Cognito ID プールフローとはどのような機能ですか?*

Amazon Cognito ユーザープールとフェデレーション ID は認証用です。Amazon Cognito ID プールは、一時的な AWS 認証情報をリクエストして AWS リソースへのアクセスを承認するために使用されます。ID プールの ID トークンとアクセストークンの交換については、このパターンでは説明していません。詳細については、「[Amazon Cognito ユーザープールとアイデンティティプールの違いは何ですか?](https://aws.amazon.com/premiumsupport/knowledge-center/cognito-user-pools-identity-pools/)」および「[Common Amazon Cognito scenarios](https://docs.aws.amazon.com/cognito/latest/developerguide/cognito-scenarios.html)」を参照してください。

**次のステップ**

このパターンでは、Amazon Cognito 認証フローの概要について説明しました。次のステップとして、アプリケーションのプログラミング言語の詳細な実装を選択する必要があります。いくつもの言語から、Amazon Cognito で使用可能な SDK とフレームワークが提供されています。有益な関連情報については、「[関連リソース](#choose-an-amazon-cognito-authentication-flow-for-enterprise-applications-resources)」セクションを参照してください。