🐕
[AWS]Cognitoの概念を整理
- CognitoはAWSが提供する、認証・認可の仕組みだよ
- 認証は、その人が誰なのか、を確認するよ
- 認可は、その人が権限を持っているか、を確認するよ
- Cognitoを使うとこの認証・認可を簡単に導入することができるよ
- Cognitoには2つの概念があるよ
- ユーザープール
- IDプール
ユーザープール
- ユーザープールは認証を管理する仕組みだよ
- ユーザープールは、Cognitoで認証した(SignUpした)ユーザーが溜まっていく場所だよ
- ユーザープールには、認証の方法がたくさん用意されているよ
- Username/Passwordによる認証
- GoogleやTwitterなどのOIDC認証
- SAML認証
- etc.
- Client側はユーザープールに対して、ユーザー登録APIを叩くよ
- ユーザープールにユーザーが作成されると、Cognitoが一意のIDを割り振るよ
- Cognitoからは、sub値にユーザーIDがセットされたIDトークンが返ってくるよ
- そのJWTを取り回すことで、認証の仕組みを自前でつくることなく、自分のアプリに組み込むことができるよ
IDプール
- IDプールは認可を管理する仕組みだよ
- IDプールは、その名の通りIDを発行して、他のAWSへのサービスへのアクセスを許可できるようにするよ
- IDプールで発行されるIDは、IAMのロールが紐付いているよ
- IAMのロールが紐付いているので、そのロールで許可されている操作は、そのIDを使用することでできるようになるよ
- 例えば、S3のオブジェクトへの読み込み権限がついていれば、IDプールのIDでアクセスが可能になるよ
// 例) IDプールのIDをAWS SDKの認証情報に設定する
var creds = new AWS.CognitoIdentityCredentials({
IdentityPoolId: 'us-east-1:xxx'
});
AWS.config.credentials = creds;
- IDプールに紐づくロールは、2種類作ることができるよ
- 未認証ユーザーのロール
- 認証済みユーザーのロール
- そのユーザーがまだなんの認証もしていない時点(そのユーザーが誰なのかわからない状態)でも、IDプールにIDを発行することができるよ
- 認証をしていないユーザーの場合は、未認証ユーザーのロールが割り当てられるよ
- 反対に、なにかしらの認証方法でサインインしたユーザーの場合は、認証済みユーザーのロールが割り当てられるよ
- この認証方法はいろいろな方法が提供されているよ
- Cognito(ユーザープール)
- GoogleやTwitterなどのOIDC認証
- SAML認証
- etc.
- 未認証ユーザーのロールと、認証済みユーザーのロールで操作権限を変えることで、ログイン前のユーザーができること、ログイン後のユーザーができることを切り替えることが、簡単にできるよ
ユーザープールとIDプールを連動させる
- ユーザープールとIDプールはそれぞれ独立した概念でもあるので、それぞれだけで使うこともできるよ
- 認可の仕組みが必要なければ、ユーザープールだけを使えばよいし、その逆も然りだよ
- さらに、IDプールの認証の仕組みとして、ユーザープールを選択することもできるよ
- ユーザープールで認証したユーザーに、IDプールの認証済みユーザーのIDを発行することができるよ
- 逆に、ユーザープールで認証していないユーザーに、IDプールの未認証ユーザーのIDを発行することができるよ
- ユーザープールとIDプールを連動させることによって、認証・認可の仕組みを簡単に導入することができるよ
Discussion