SAML連携しているCognitoで認証して、PostmanからGraphQLリクエストを送信する

Page content

SAML連携しているCognitoで認証して、PostmanからGraphQLリクエストを送信する

AWS AppSyncの認証にAmazon Cognitoを使用しており、さらにCognitoが社内IdPなどとSAML連携している構成の場合、AWSコンソールのAppSyncのクエリ画面(テストクエリ)からGraphQLリクエストを送信しようとしても、コンソール上で完結してテストすることができません。

PostmanのAuthorization機能(OAuth 2.0 / Authorization Code With PKCE)を利用して、Cognitoの認証(SAML連携によるログイン)を行い、AppSyncにGraphQLリクエストを送信する方法を紹介します。

前提条件

  • AppSyncの認証にAmazon Cognitoを使用していること。
  • Cognitoのユーザープールに、SAML連携によるIdentity Providerが設定済みであること。
  • Cognitoのユーザープールに、Postmanからのリダイレクトを受け付けるためのApp Clientが設定済みであること(コールバックURLにPostmanのコールバックURLを許可しておく必要があります)。

Cognitoの認証情報を確認する

Postmanの設定に入る前に、Cognitoのユーザープール、およびApp Client(アプリクライアント)の設定画面から以下の情報を確認しておきます。

  • ユーザープールドメイン(https://xxxx.auth.ap-northeast-1.amazoncognito.comの形式)
  • App ClientのクライアントID
  • App ClientのコールバックURL
  • SAML連携で設定したIdentity Providerの名前

これらの情報を使って、Postman側でAuthorizationの設定を行います。

Postmanでリクエストを作成する

まずは通常のGraphQLリクエストと同様に、AppSyncのエンドポイント(https://xxxx.appsync-api.ap-northeast-1.amazonaws.com/graphql)に対するPOSTリクエストを作成します。

Authorizationタブを設定する

作成したリクエストのAuthorizationタブを開き、以下のとおり設定していきます。今回はSAML連携によるログインをブラウザ経由で行う必要があるため、Auth TypeOAuth 2.0を選択します。

設定項目は以下のとおりです。

項目 設定値 備考
Token Name 任意の名前 識別用の名前なので何でも構いません。
Grant type Authorization Code (With PKCE) Cognitoのホストされた UI 経由でSAML連携ログインを行うため、この設定を使用します。
Callback URL App Clientに設定したコールバックURL Cognito側で許可しているコールバックURLと一致させる必要があります。
Authorize using browser 任意 ブラウザ側でSAMLログインの画面を表示したい場合はチェックします。
Auth URL https://xxxx.auth.ap-northeast-1.amazoncognito.com/oauth2/authorize 後述します。
Access Token URL https://xxxx.auth.ap-northeast-1.amazoncognito.com/oauth2/token 後述します。
Client ID App ClientのクライアントID -
Client Secret (App Clientの設定による) クライアントシークレットを発行していない場合は空欄のままにします。
Code Challenge Method SHA-256 PKCEの標準的な設定です。
Scope openid email profile 必要に応じて調整してください。
Client Authentication Send client credentials in body -

さらにAdvancedを開き、Auth Requestに以下のパラメータを追加します。

Key Value 備考
identity_provider SAML連携で設定したIdentity Providerの名前 後述します。

設定が完了したら、画面下部のGet New Access Tokenを押下します。ブラウザ(またはPostman内蔵のブラウザ)がポップアップし、SAML連携先のログイン画面が表示されるので、資格情報を入力してログインします。ログインが成功すると、CognitoがPostmanのコールバックURLに認可コードを返却し、Postmanが自動的にアクセストークンを取得します。

はまりどころ

実際に設定を行う際につまずいたポイントを3点紹介します。

1. Auth URLに/oauth2/authorizeを付与する

CognitoのユーザープールドメインをそのままAuth URLに設定してしまうと正しく動作しません。ユーザープールドメイン(https://xxxx.auth.ap-northeast-1.amazoncognito.com)の末尾に、/oauth2/authorizeを付与した以下の形式で指定する必要があります。

https://xxxx.auth.ap-northeast-1.amazoncognito.com/oauth2/authorize

2. Access Token URLに/oauth2/tokenを付与する

Auth URLと同様に、Access Token URLについてもユーザープールドメインの末尾に/oauth2/tokenを付与した以下の形式で指定する必要があります。

https://xxxx.auth.ap-northeast-1.amazoncognito.com/oauth2/token

3. Auth Requestにidentity_providerを指定する

CognitoのApp Clientに複数のIdentity Provider(Cognitoユーザープール自体や、SAML連携先など)が設定されている場合、Auth Requestにidentity_providerパラメータを指定しないと、Cognitoが提供するデフォルトのログイン画面(IdP選択画面やCognitoのユーザープール自体のログイン画面)が表示されてしまい、意図したSAML連携先のログイン画面に遷移しません。

AdvancedAuth Requestに、identity_providerをキーとして、Cognitoのユーザープールで設定したSAML連携のIdentity Provider名を値として指定することで、SAML連携先のログイン画面に直接遷移させることができます。

GraphQLリクエストを送信する

アクセストークンが取得できたら、BodyタブをGraphQLに切り替え、クエリを入力してSendを押下します。取得したアクセストークンはAuthorizationタブの設定に従って、自動的にAuthorizationヘッダに付与されます。

正しく認証・認可が行われていれば、以下のようにAppSyncからのレスポンスを確認することができます。

まとめ

CognitoがSAML連携している環境では、AWSコンソールのAppSyncのテストクエリ機能からGraphQLリクエストを送信することができません。PostmanのOAuth 2.0(Authorization Code With PKCE)によるAuthorization機能を利用することで、SAML連携によるログインを経由してAppSyncにGraphQLリクエストを送信することができます。

特にAuth URL/Access Token URLへのパス付与や、identity_providerの指定は見落としがちなポイントですので、SAML連携環境でPostmanからAppSyncを操作する際の参考になれば幸いです。