認可エンドポイント - Amazon Cognito

認可エンドポイント

/oauth2/authorize エンドポイントは、2 つのリダイレクト先をサポートするリダイレクトエンドポイントです。URL に identity_provider または idp_identifier のパラメータを含めると、ユーザーはその ID プロバイダー (IdP) のサインインページにそのままリダイレクトされます。それ以外の場合は、リクエストに含まれるものと同じ URL パラメータを持つ ログインエンドポイント にリダイレクトされます。

認証エンドポイントを使用するには、ユーザープールに以下のユーザープールの詳細に関する情報を提供するパラメータを使用して、ユーザーのブラウザを /oauth2/authorize で呼び出します。

  • サインインするアプリクライアント。

  • 終了させたいコールバック URL。

  • ユーザーのアクセストークンでリクエストする OAuth 2.0 スコープ。

  • サインインに使用するサードパーティーの IdP (任意)。

また、Amazon Cognito が受信クレームの検証に使用する state および nonce パラメータを提供することもできます。

GET /oauth2/authorize

/oauth2/authorize エンドポイントは HTTPS GET のみをサポートします。アプリは通常、このリクエストをユーザーのブラウザで開始します。/oauth2/authorize エンドポイントへのリクエストは、HTTPS でのみ行うことができます。

OpenID Connect (OIDC) 標準における認可エンドポイントの定義の詳細については、「Authorization Endpoint」(認可エンドポイント) を参照してください。

パラメータのリクエスト

response_type

レスポンスのタイプ。code または token を指定する必要があります。

response_typecode のリクエストに成功すると、認証コード付与を返します。認証コード付与とは、Amazon Cognito がリダイレクト URL に追加する code パラメータです。アプリは トークンエンドポイント と、アクセス、ID、更新の各トークンとコードを交換することができます。セキュリティ上のベストプラクティスとして、またユーザーに更新トークンを受け取るには、アプリで認証コード付与を使用します。

response_typetoken のリクエストに成功すると、暗黙的な付与を返します。暗黙的な付与とは、Amazon Cognito がリダイレクト URL に追加する ID とアクセストークンのことです。暗黙的な付与は、トークンと潜在的な識別情報をユーザーに公開するため、安全性が低くなります。アプリクライアントの設定で、暗黙的な付与のサポートを無効にできます。

必須。

client_id

クライアント ID。

client_id の値は、リクエストを行うユーザープール内のアプリクライアントの ID である必要があります。アプリクライアントは、Amazon Cognito ローカルユーザーまたは少なくとも 1 つのサードパーティー IdP によるサインインをサポートしている必要があります。

必須。

redirect_uri

Amazon Cognito がユーザーを認証した後、認証サーバーによってブラウザがリダイレクトされる URL です。

リダイレクト Uniform Resource Identifier (URI) には次の属性が必要です。

  • 絶対 URI である。

  • URI を事前にクライアントに登録しておく必要があります。

  • フラグメントコンポーネントが含まれていない。

OAuth 2.0 - リダイレクトエンドポイント」を参照してください。

Amazon Cognito では、テスト目的のコールバック URL として設定できる http://localhost を除き、リダイレクト URI に HTTPS を使用することが必要です。

Amazon Cognito では、myapp://example のようなアプリのコールバック URL もサポートしています。

必須。

state

アプリがリクエストに state パラメータを追加すると、Amazon Cognito は/oauth2/authorize エンドポイントはユーザーをリダイレクトする際に、その値をアプリに返します。

この値をリクエストに追加して CSRF 攻撃から保護します。

state パラメータの値を、URL でエンコードされた JSON 文字列に設定することはできません。この形式に一致する文字列を state パラメータで渡すには、文字列を Base 64 にエンコードし、アプリ内でデコードします。

オプションですが、推奨しません。

identity_provider

このパラメータを追加して、ホストされた UI をバイパスし、ユーザーをプロバイダーのサインインページにリダイレクトします。identity_provider パラメータの値はユーザープールに表示される ID プロバイダー (IdP) の名前です。

  • ソーシャルプロバイダーの場合、identity_providerFacebookGoogleLoginWithAmazon、および SignInWithApple を使用できます。

  • Amazon Cognito ユーザープールの場合、値 COGNITO を使用します。

  • SAML 2.0 および OpenID Connect (OIDC) ID プロバイダー (IdP) の場合は、ユーザープールで IdP に割り当てた名前を使用します。

オプション。

idp_identifier

このパラメータを追加して、identity_provider 名の代替名を持つプロバイダーにリダイレクトします。Amazon Cognito コンソールの [Sign-in experience] (サインインエクスペリエンス) タブから、SAML 2.0 および OIDC IdP の識別子を入力できます。

オプション。

scope

クライアントに関連付けられているシステム予約されたスコープ、またはカスタムスコープの組み合わせにすることができます。スコープはスペースで区切る必要があります。システム予約されたスコープは openidemailphoneprofile、および aws.cognito.signin.user.admin です。使用されるスコープは、いずれもクライアントに関連付けられている必要があり、関連付けられていなければ、ランタイム時に無視されます。

クライアントがスコープをリクエストしない場合、認証サーバーはクライアントに関連付けられているすべてのスコープを使用します。

ID トークンは openid スコープがリクエストされた場合にのみ返されます。Amazon Cognito ユーザープールに対してアクセストークンを使用できるのは、aws.cognito.signin.user.admin スコープがリクエストされている場合のみです。phoneemail、および profile スコープは、openid スコープがリクエストされた場合にのみリクエストできます。これらのスコープは ID トークン内でクレームを記述します。

オプション。

code_challenge_method

チャレンジを生成するために使用されるメソッドです。PKCE RFC では S256 および plain の 2 つのメソッドが定義されていますが、Amazon Cognito 認証サーバーでは S256 のみがサポートされています。

オプション。

code_challenge

code_verifier から生成されたチャレンジ。

code_challenge_method パラメータを指定した場合にのみ必須です。

ノンス

リクエストに追加できるランダムな値。指定したノンス値は、Amazon Cognito が発行する ID トークンに含まれます。リプレイ攻撃を防ぐために、アプリは ID トークンの nonce クレームを検査し、生成したものと比較することができます。nonce クレームの詳細については、「OpenID Connect standard」(OpenID Connect 標準) の「ID token validation」(ID トークンの検証) を参照してください。

肯定応答を含むリクエストの例

認可コード付与

リクエスト例

GET https://mydomain.auth.us-east-1.amazoncognito.com/oauth2/authorize? response_type=code& client_id=ad398u21ijw3s9w3939& redirect_uri=https://YOUR_APP/redirect_uri& state=STATE& scope=openid+profile+aws.cognito.signin.user.admin
レスポンス例

Amazon Cognito 認証サーバーは、承認コードとステートを伴ってリダイレクトしアプリに戻ります。コードとステートはフラグメントではなく、クエリ文字列パラメータで返される必要があります。クエリ文字列はウェブリクエストの一部で、「?」文字の後に追加されます。この文字列には「&」文字で区切られたパラメータを 1 つ以上含めることができます。フラグメントはウェブリクエストの一部で「#」文字の後に追加され、ドキュメントのサブセクションを指定します。

注記

レスポンスは、5 分間有効な 1 回限りのコードを返します。

HTTP/1.1 302 Found Location: https://YOUR_APP/redirect_uri?code=AUTHORIZATION_CODE&state=STATE

PKCE を使用した認可コード付与

リクエスト例

GET https://mydomain.auth.us-east-1.amazoncognito.com/oauth2/authorize? response_type=code& client_id=ad398u21ijw3s9w3939& redirect_uri=https://YOUR_APP/redirect_uri& state=STATE& scope=aws.cognito.signin.user.admin& code_challenge_method=S256& code_challenge=CODE_CHALLENGE
レスポンス例

認可サーバーは認可コードとステートを伴ってリダイレクトしアプリに戻ります。コードとステートはフラグメントではなく、クエリ文字列パラメータで返される必要があります。

HTTP/1.1 302 Found Location: https://YOUR_APP/redirect_uri?code=AUTHORIZATION_CODE&state=STATE

openid スコープを使用しないトークン付与

リクエスト例

GET https://mydomain.auth.us-east-1.amazoncognito.com/oauth2/authorize? response_type=token& client_id=ad398u21ijw3s9w3939& redirect_uri=https://YOUR_APP/redirect_uri& state=STATE& scope=aws.cognito.signin.user.admin
レスポンス例

Amazon Cognito 認証サーバーはアクセストークンを伴ってリダイレクトし、アプリに戻ります。openid スコープがリクエストされなかったため、Amazon Cognito は ID トークンを返しません。また、Amazon Cognito はこのフローで更新トークンを返しません。Amazon Cognito はアクセストークンとステートをクエリ文字列ではなくフラグメントで返します。

HTTP/1.1 302 Found Location: https://YOUR_APP/redirect_uri#access_token=ACCESS_TOKEN&token_type=bearer&expires_in=3600&state=STATE

openid スコープを使用したトークン付与

リクエスト例

GET https://mydomain.auth.us-east-1.amazoncognito.com/oauth2/authorize? response_type=token& client_id=ad398u21ijw3s9w3939& redirect_uri=https://YOUR_APP/redirect_uri& state=STATE& scope=aws.cognito.signin.user.admin+openid+profile
レスポンス例

認可サーバーはアクセストークンと ID トークンを伴ってリダイレクトしアプリに戻ります (openid スコープが含まれていたため)。

HTTP/1.1 302 Found Location: https://YOUR_APP/redirect_uri#id_token=ID_TOKEN&access_token=ACCESS_TOKEN&token_type=bearer&expires_in=3600&state=STATE

否定応答の例

否定応答の例を次に示します。

  • client_idredirect_uri が有効であるが、リクエストパラメータが正しくフォーマットされていない場合、認証サーバーはエラーをクライアントの redirect_uri にリダイレクトし、URL パラメータにエラーメッセージを追加します。正しくない形式の例としては、リクエストに response_type パラメータが含まれていない場合、レスポンスが code_challenge を提供するが code_challenge_method がない場合、code_challenge_method が「S256」でない場合などがあります。

    HTTP 1.1 302 Found Location: https://client_redirect_uri?error=invalid_request

  • クライアントが response_typecode または token をリクエストしたが、これらのリクエストの許可を持っていないという場合は、以下にあるように、Amazon Cognito 認証サーバーが unauthorized_client をクライアントの redirect_uri に返します。

    HTTP 1.1 302 Found Location: https://client_redirect_uri?error=unauthorized_client

  • クライアントが無効、不明、または有効ではない形式のスコープをリクエストする場合は、以下にあるように、Amazon Cognito 認証サーバーが invalid_scope をクライアントの redirect_uri に返します。

    HTTP 1.1 302 Found Location: https://client_redirect_uri?error=invalid_scope

  • サーバーで予期しないエラーが発生した場合は、認証サーバーがクライアントの redirect_uriserver_error を返します。HTTP 500 エラーはクライアントに送信されないので、ブラウザでユーザーにエラーを表示しないでください。以下のようなエラーが発生します。

    HTTP 1.1 302 Found Location: https://client_redirect_uri?error=server_error

  • Amazon Cognito がサードパーティーの ID プロバイダーとのフェデレーションを通じて認証するときは、以下のような接続問題が発生する場合があります。

    • IdP からトークンをリクエストしているときに接続タイムアウトが発生した場合、認証サーバーは以下のようにエラーをクライアントの redirect_uri にリダイレクトします。

      HTTP 1.1 302 Found Location: https://client_redirect_uri?error=invalid_request&error_description=Timeout+occurred+in+calling+IdP+token+endpoint

    • id_token 検証のための jwks エンドポイントの呼び出し時に接続タイムアウトが発生する場合、認証サーバーは以下のようにエラーをクライアントの redirect_uri にリダイレクトします。

      HTTP 1.1 302 Found Location: https://client_redirect_uri?error=invalid_request&error_description=error_description=Timeout+in+calling+jwks+uri

  • サードパーティーの IdP にフェデレーションして認証する場合、プロバイダーは設定エラーまたは次のようなその他の理由でエラーレスポンスを返すことがあります。

    • 他のプロバイダーからエラーレスポンスを受け取った場合、認証サーバーは以下のようにエラーをクライアントの redirect_uri にリダイレクトします。

      HTTP 1.1 302 Found Location: https://client_redirect_uri?error=invalid_request&error_description=[IdP name]+Error+-+[status code]+error getting token

    • Google からエラーレスポンスを受け取った場合、認証サーバーは次のようにエラーをクライアントの redirect_uri にリダイレクトします: HTTP 1.1 302 Found Location: https://client_redirect_uri?error=invalid_request&error_description=Google+Error+-+[status code]+[Google provided error code]

  • Amazon Cognito が外部 IdP への接続中に通信プロトコルで例外を検出した場合、認証サーバーは次のいずれかのメッセージでエラーをクライアントの redirect_uri にリダイレクトします。

    • HTTP 1.1 302 Found Location: https://client_redirect_uri?error=invalid_request&error_description=Connection+reset

    • HTTP 1.1 302 Found Location: https://client_redirect_uri?error=invalid_request&error_description=Read+timed+out