🐷

[AWS][cognito]認証・認可

2024/08/04に公開

Cognitoとは

AWSリソースに対して認証・認可の機能を提供するサービス。
認証・認可機能はWeb/モバイルアプリのセキュリティ要件には必ず存在する要件の一つだが、その機能をCognitoを用いることで簡単に実装できる。

Cognito User Poolとは

User Poolは認証機能を提供する。認証とは「あなたは誰ですか?(ユーザ名)それを証明するものを提示してください(パスワード)」ということだと認識してもらって構わない。
APIコール時にユーザ名とパスワードを指定して、対象のユーザがuser poolに存在している(認証済みユーザ)かを検証する。

認証フローの例を以下に記載する。lambdaに認証されたユーザのみがアクセスできる。

  1. API Gatewayにアクセスの際オーソライザで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を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]

参考文献

Discussion