Cognitoユーザープールの認証にソーシャルサインイン(Google)を追加したうえでGoogleのアクセストークンを取得してみる

Cognitoユーザープールでソーシャルサインイン(Google)を追加した際に属性マッピング設定をよく見てみると、 access_tokenの値があったりして、アクセストークンを取得できることに初めて気がついたので試してみました。
2020.07.30

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

Cognitoを利用すると認証機能を簡単に実装できます。Googleアカウントでログインするなんてことも簡単に実現できます。

Cognitoユーザープールでソーシャルサインイン(Google)を追加する方法は、こちらの弊社ブログで設定方法を紹介しています。

外部IDプロバイダー(Google等)との連携設定をする際に、Cognitoユーザープールのユーザー属性と外部IDプロバイダーのユーザー属性、どれとどれが対応するのかという属性マッピングを設定することができます。

そしてGoogleの属性マッピング設定をよく見てみると、 access_token の値があったりして、アクセストークンをCognitoユーザーの属性として取り込めることに初めて気がついたので試してみました。

やってみた

マネジメントコンソールのCognitoユーザープールの画面で、Googleの属性マッピング設定をします。今回は、Cognitoユーザープールにカスタム属性を作っておいて、 custom:my-attribute に割り当ててみます。

そして、アプリクライアントの設定から有効なIDプロバイダにGoogleへチェックを入れて、ホストされたUIを起動してGoogleでのログインを試してみます。

Cognitoのログイン画面でGoogleでのログインを選択します。

そうするとGoogleのログイン画面がでてくるのでそのままログインします。

Googleのログインが完了するとブラウザの表示は設定されたCallback URLへコールバックされてしまいますが、それは無視します。 Googleへのログインは完了したのでCognitoユーザープールのユーザーは更新されているはずです。Cognitoユーザープールのユーザーを確認します。

Cognitoユーザープールで先ほどログインしたGoogleアカウントに対応するユーザーを確認してみると、ユーザー属性の custom:my-attribute にアクセストークンらしき文字列が追加されていることが確認できました。

GoogleのアクセストークンでGoogleのユーザー情報を取得してみる

アクセストークンらしきものが取得できたので、本当に有効なアクセストークンなのか、GoogleのUserInfoエンドポイントに問い合わせてみます。

GoogleログインはOpenID Connect仕様に準拠しているので、それにそったやり方で取得できるはずです。

OpenIDプロバイダに関する情報を取得する手段として、Discovery Documentが公開されています。

これを参照すると、UserInfoエンドポイントは、「 https://openidconnect.googleapis.com/v1/userinfo 」のようです。

UserInfoエンドポイントへのリクエスト方法は、OpenID Connectの仕様として定められています。

よって、次のように curl コマンドを使えば、GoogleのUserInfoエンドポイントにユーザー情報をリクエストできます。

$ ACCESS_TOKEN=<<Cognitoユーザーに追加されたGoogleのアクセストークンをコピー&ペースト>>
$ curl -H "Authorization:Bearer ${ACCESS_TOKEN}" \
  https://openidconnect.googleapis.com/v1/userinfo
{
  "sub": "XXXXXXXXXXXXXXXXXXXXXX",
  "name": "北野佑一",
  "given_name": "佑一",
  "family_name": "北野",
  "picture": "https://lh4.googleusercontent.com/-iEi5_3J80zg/AAAAAAAAAAI/AAAAAAAAAAA/AMZuucnIDG9McGjbwvrMpFwIY-HrUSvEVQ/photo.jpg",
  "email": "xxxxxxxxxxx@gmail.com",
  "email_verified": true,
  "locale": "ja"
}

結果、確かにユーザー情報が取得できており、Googleの有効なアクセストークンがCognitoユーザーの属性に取り込めていることが確認できました。

終わりに

CognitoでGoogleを利用したフェデレーションログインしつつ、Googleのアクセストークンを取得してみました。

興味本位でやってみただけなので、どういうユースケースにはまるかはまだピンと来てないのですが、Cognitoを利用してログインしつつ、Googleのアクセストークンを利用してGoogleのリソースにアクセスしたいなんて時に、この機能を利用することを検討してもよいと思います。