🔖

Cognito User Pool で Client Credentials flow を curl で試す方法

2021/10/09に公開

これは何?

  • Cognito User Pool で Client Credentials flow を使う
  • curl で Token Endpoint にリクエストしてアクセストークンを取得する方法のメモ

前提

  • Cognito User Pool を作成してドメインを設定
  • リソースサーバーを設定してカスタムスコープを設定
  • シークレットを含むアプリクライアントを作成

設定方法についてはドキュメントに手順あり

https://docs.aws.amazon.com/cognito/latest/developerguide/cognito-user-pools-app-integration.html

https://docs.aws.amazon.com/cognito/latest/developerguide/cognito-user-pools-app-idp-settings.html

curl で Token Endpoint にリクエストする例

DOMAIN=https://sample.auth.ap-northeast-1.amazoncognito.com
APP_CLIENT_ID=xxx
APP_CLIENT_SECRET=yyy
curl -s -X POST ${DOMAIN}/oauth2/token \
-H "Authorization: Basic $(echo -n ${APP_CLIENT_ID}:${APP_CLIENT_SECRET} | base64 )" \
-H "Content-Type: application/x-www-form-urlencoded" \
-d "grant_type=client_credentials" \
-d "client_id=${APP_CLIENT_ID}"

Reference

https://docs.aws.amazon.com/cognito/latest/developerguide/token-endpoint.html

リクエスト結果の例

{
  "access_token": "eyJ...",
  "expires_in": 3600,
  "token_type": "Bearer"
}

ID Token, Refresh Token は無しで Access Token のみ。
Access Token の Payload は以下のようになっている。

{
  "sub": "xxx",
  "token_use": "access",
  "scope": "sample/read",
  "auth_time": 1633781133,
  "iss": "https://cognito-idp.ap-northeast-1.amazonaws.com/ap-northeast-1_zzz",
  "exp": 1633784733,
  "iat": 1633781133,
  "version": 2,
  "jti": "39cdbc77-8743-4e1e-9669-96e62b165f1c",
  "client_id": "xxx"
}

特徴的なのは sub と client_id が同じになる点。
これはそもそも Client Credentials flow では特定ユーザーを対象としないため、使用したアプリクライアント ID がそのまま sub として扱われるようになっている様子。

何に使えるのか

  • Cognito User Pool を使っていて、システム間連携したい場合
    • 一方で Amazon API Gateway を利用予定なら、 IAM を使ってアクセスコントロールしたほうがシンプルかもしれない
  • OAuth, OIDC に関する既存のライブラリ資産等があり、諸々の事情によって使わざるを得ない場合

Discussion