はじめに
本記事は、cognito ネイティブユーザー(ユーザープール経由で直接サインインしたユーザー)とフェデレーションユーザー(Facebook、Google、Amazon、Apple 経由のソーシャルサインインしたユーザー)をメールアドレスが同じなら同一のユーザーとして扱おうとしたが、Amazon Cognitoの一部制約でCognitoのユーザープール内で実現しなかったお話である。
Amazon Cognitoとは
ウェブおよびモバイルアプリの認証、承認、およびユーザー管理機能を提供します。ユーザーは、ユーザー名(またはメールアドレス)とパスワードを使用して直接サインインするか、Facebook、Amazon、Google、Apple などのサードパーティーを通じてサインインできる。
ユーザープールとは
ユーザープールは、Amazon Cognito のユーザーディレクトリです。ユーザープールを使用することで、ユーザーはウェブまたはモバイルアプリに Amazon Cognito 経由でサインインする、またはサードパーティー ID プロバイダー (IdP) 経由でフェデレートすることができます。ユーザーが直接またはサードパーティーを通じてサインインするかどうかにかかわらず、ユーザープールのすべてのメンバーには、SDK を通じてアクセスできるディレクトリプロファイルがあります。
※AWSのドキュメントの Amazon Cognitoとは から引用
Amazon Cognitoの一部制約で実現しなかった理由
前提条件
Webアプリの機能要件として、Slackのような①直接サインインしたユーザー(メールアドレスとパスワード)と②Googleのサードパーティーを通してサインインしたユーザーのメールアドレスが同じなら同一のユーザーとして扱いたいとのこと
上記の機能要件を満たすため、Amazon Cognitoのユーザープール内で管理できるか検討した。
Amazon Cognitoの一部制約とは
AWS Support CenterのSAによると、下記の①でcognito ネイティブユーザーを作成して、②のGoogleのサードパーティーを通してサインインした場合、Amazon CognitoのAdminLinkProviderForUser APIを使用すれば実現は可能だとのことでした。
しかし、当該APIは、既存のCognito ネイティブユーザーおよびフェデレーションユーザーに対して、まだサインインを行ったことのない外部 IdP のユーザーを紐づけることは可能なだけで、②、①の順番で同一ユーザーをユーザープール内で実現することは現時点では不可能でした。
Cognitoのユーザープールのアカウントの種類
①直接サインインしたユーザー(メールアドレスとパスワード)
②Googleのサードパーティーを通してサインインしたユーザー
ドキュメント
AdminLinkProviderForUser
フェデレーションユーザーを既存のユーザープロファイルにリンクする
最後に
本制約が、いつか改善されて欲しい。