🐷

[AWS]cognito認可から認証まで

2024/08/04に公開

Cognitoとは

AWSリソースに対して認証や認可の機能を提供してくれるサービス。
認証、認可の機能はWebアプリケーションやモバイルアプリのセキュリティ要件には必ず存在する要件の一つだがその機能を簡単に実装できる。

cognito User Poolとは

User PoolはCognitoで認証を担当している。認証とは「あなたは誰ですか?(ユーザ名)それを証明するものを提示してください(パスワード)」ということだと認識してもらって構わない。
APIを呼び出す時にユーザ名とパスワードを指定して本当に対象のユーザがuser poolに存在している(認証済みユーザ)かを検証する。
例として以下のフローで認証が実施される

上記の例ではlambdaに認証されたユーザのみがアクセスできる様になっている

  1. 対象サービスにアクセスするためのapiを叩くと認証先にリダイレクトされるのでuser nameとpasswdを持って認証
  2. user pool内に問い合わせしてきたユーザいれ認証トークン(id token)をもらう
  3. 認証トークンをオーソライザーが検証して認証をする
  4. オーソライザーの認証が通れば対象サービスにアクセス
    のような流れになる

UserPoolの作成、ユーザ登録

以下、apiでの実装例

# make Cognito user pool
aws cognito-idp create-user-pool --pool-name "test_pools"

# regist user
aws cognito-idp admin-create-user --user-pool-id [user_pool_id] \
    --username [user_name] --temporary-password [pass_word]

# change user status
aws cognito-idp admin-initiate-auth --user-pool-id [user_pool_id] \
    --auth-flow [ADMIN_USER_PASSWORD_AUTH] \
    --auth-parameters [ADMIN_USER_PASSWORD_AUTH] \
    --client-id [app_client_id]

認証機能の実装

以下、 apiでの実装例
id tokenが払い出される。このid tokenをcognitoのオーソライザが評価することで認証機能が成り立つ。

# 認証を通す
aws cognito-idp initiate-auth --auth-flow [USER_PASSWORD_AUTH] \
    --auth-parameter [USERNAME=key,PASSWORD=key] \
    --client-id [app_client_id]

cognito Identity Poolとは

Identity poolとはCognitoでの認可を担当している。認可とはどのサービスにアクセスして良いかを許可する機能である。Cognitoは認可を与えたユーザに対して用意していたIAMロールを付与する。そのロールが対象サービスにアクセスして良い許可(Access Token)を一時的に払い出す。

  1. 有効なid tokenを持って認可してもらいに行く
  2. id tokenが有効で(認証済み)あれば一時的なクレデンシャルが事前に準備していたIAMロールとともに付与される。
  3. 付与されたIAMロールに従ってアクセスできるリソースにアクセスしに行く

認可機能の実装

以下、apiでの実装例

# make identity pool
aws cognito-identity create-identity-pool \
    --identity-pool-name [id_pool_name]
    --no-allow-unauthenticated-identities \
    --allow-classic-flow
    --cognito-identity-providers [user_pool_name or client_id] #作成したuserpool

Identity Poolの作成

# get cognito identity pool ID
aws cognito-identity get-id --identity-pool-id [identity_pool_id]

# 認可情報を払い出す
aws cognito-identity get-credentials-for-identity --identity-id [identity_id]

apiの実装であるがboto3などでlambdaに載せると構成図通りにリソースの作成ができる。やってないが笑

参考文献

Discussion