Web Identity Federationとは?
例えば、DynamoDB SDK
を使ってDynamoDB
にアクセスする際にアクセスキーが必要となりますが、アプリに埋め込むのは当然ながら非推奨デス。
これをいい感じに解決しAWSリソースに対するアクセスを許可させる方法がSecurityTokenService(STS)
を用いたWeb Identity Federation
です。
①ユーザーに一般的なサードパーティー ID プロバイダー (Login with Amazon、Facebook、Google、OpenID Connect (OIDC) 2.0 互換の任意のプロバイダーなど) を使用したサインインを求めることができます。②,③そのプロバイダーの認証情報を AWS アカウントのリソースを使用するための一時的なアクセス許可に変換することができます。 IAM の一時的なセキュリティ認証情報
①amazonのアカウントにログイン、amazon(IdP)からtokenが返ってくる。
②そのtokenをSTSに渡すとSTSは期限つきのIAMロール(AssumeRole)を発行
③AssumeRoleを使いDynamoDBにアクセス
①が認証、②③が認可という関係になりますね。
簡単に書きましたが実装にはIAM側での設定などが必要になります。IAM ID プロバイダーの作成
そんなWeb Identity Federation
をアプリケーションで使う際に推奨されているのがAWS Cognito
!
AWS Cognitoとは?
ウェブアプリケーションやモバイルアプリケーションの認証、許可、ユーザー管理をサポートしてくれます!
Cognitoのコンポーネント
コンポーネントは主にユーザープール、IDプールの2つで構成されています。
◯ユーザープール
ユーザープールはユーザーの認証と管理を行うコンポーネント
■ 認証方法
-
ユーザー名 (設定でメールアドレスや電話番号も使用可) とパスワードを入力してログイン認証(Cognitoユーザープールが提供する認証機能)
-
外部IDプロバイダーと連携した認証(Facebook, Google, Amazon, Apple)
Cognitoユーザープールが提供する認証機能はユーザー自身がサインアップを行い登録、また管理者が事前に登録する事もできます。
■ 認証されたユーザー情報はどこに登録される?
認証されたユーザー情報はユーザープールに登録されます。
認証された証としてIDトークン
が発行され、このIDトークン
を使い、アプリケーションがユーザーを特定したり、他のサービスとの連携を行うことが出来ます。
◯IDプール
外部IDプロバイダーによって認証されたIDに対して、AWSへのアクセス権限を持つ一時クレデンシャル
を返すコンポーネント
■ 認証方法
- 外部IDプロバイダー認証(Cognitoユーザープール, Amazon, Facebook, Google, Twitter, OIDCに準拠したプロバイダー, SAMLに準拠したプロバイダー)
■ ユーザープールとの違いは?
- ユーザープールは認証を行うコンポーネント
- IDプールは認可を行うコンポーネント
どちらのコンポーネントも外部プロバイダー認証(IdP)を使えますが、IDプールでは認証後に付与される一時クレデンシャル
を使い、アクセスが許可されているAWSリソースに対してアクセスすることができます。
◯ユーザープールとIDプール
IDプールのIdPにユーザープールを指定可能です。つまり、ユーザープールトークンとIDプールトークン (STS)は交換することが可能です。
①アプリにアクセスするとログイン画面にリダイレクト認証を行う
②IDプールのIdPとしてユーザープールを指定することでユーザープールのIDトークンから一時クレデンシャルを返す
③一時クレデンシャルを使いアクセスが許可されているAWSリソースに対してアクセス
ハンズオンも書く予定でしたが疲れたので次回にします笑
Cognito初心者なので間違ってるところあれば教えてください!
参考
[ウェブ ID フェデレーションについて]
(https://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/id_roles_providers_oidc.html)
AWS再入門ブログリレー Amazon Cognito編
[AWS Black Belt Online Seminar] Amazon Cognito 資料及び QA 公開