めも: Cognito Identity Pool で ID token の検証をする

この記事で、frontend から送られてきた ID token を「IAM ロールのウェブ ID フェデレーション」でやる方法が紹介されていたんだけど、SAM でやりにくそうだったので別の方法を調べてみた

[:content]

「IAM ロールのウェブ ID フェデレーション」とは

外部 ID プロバイダーで認証されていることを IAM ロールの引き受け条件とするタイプのもの

これが記事にある説明。記事のセットアップだと Cognito の User Pool を IAM の Identity Provider として使っているので、↑の意味は「Cognito の User Pool で認証されていないと IAM Role を引き受けられない」となる。 で、 AssumeRole (= IAM ロールの引受) をするときに、FE から来た ID Token を検証するから

Assume Role ができる <=> ID Token is valid

となる

SAM でできなそう

ただ、 IAM ロールの web id federation をするためには、 Cognito User Pool を IAM の Identity Provider にする必要がある。が、このセットアップで Cognito User Pool の thumbprint を取得する部分が SAM だとできなそうだった。ので、Cognito Identity Pool で同様のことを実現する。

サポート問合せしたら、

  1. Cognito Identity Pool と、User Pool の app client を紐づけて
  2. Identity Pool に対して GetId を投げるといいとのこと

GetId

サポートからは「ID トークンを GetId に渡せばできます」的なことを言われたんだけど、ドキュメントを読んでもどこにも ID トークンを渡しているところが見つからなかった。

結論これでいけるらしい

{
   "AccountId": "string",
   "IdentityPoolId": "string",
   "Logins": { 
      "cognito-idp.<REGION>.amazonaws.com/<YOUR_USER_POOL_ID>" : "<ID_TOKEN>" 
   }
}

Logins のところに

A set of optional name-value pairs that map provider names to provider tokens. The available provider names for Logins are as follows:

とかいてあって、この provider token = ID トークンぽい