CognitoIDプールを使った独自認証、認証後STSを使った一時クレデンシャルの返却まで

CognitoIDプールを使った独自認証、認証後STSを使った一時クレデンシャルの返却まで:


概要

AWS公式のID プール (フェデレーティッドアイデンティティ) の認証フロー開発者が認証した ID の認証フロー基本的な認証フロー をやります。

拡張認証フロー の方がほとんどのお客様にとって、正しい選択だと書いてありますが、何か上手くいかなかったのでとりあえず基本の方やります。。


環境

  • 公式フローだと、AssumeRoleWithWebIdentity はクライアントからやることになっていますが、面倒くさいので、Lambdaの中で完結させます。
  • 独自認証の認証自体はやりません。

    ※認証できているという前提で、GetOpenIdTokenForDeveloperIdentity からやります。

     実際には GetOpenIdTokenForDeveloperIdentity の前に独自認証の処理が必要です。


準備


CognitoIDプールを作成する

  1. Cognitoの"フェデレーティッドアイデンティティ"のページを開く
  2. "新しい ID プールの作成"ボタンを押す
  3. ↓にチェックいれて(それ以外は適当でOK(認証しないので))、"プールの作成"
    image.png
  4. 認証プロバイダを下記で設定 ※開発者プロバイダの名前は任意で良い
    image.png

  5. あとはとにかく次へ行ってCognitoIDプールが作成する。


Lambdaの実装

下記のコードをLambdaにコピペしてください。

Lambda
import json 
import boto3 
 
def lambda_handler(event, context): 
 
    # 事前にここに独自認証の処理を行う(要件に合わせて自分で実装) 
 
    client = boto3.client('cognito-identity') 
    response = \ 
        client.get_open_id_token_for_developer_identity(IdentityPoolId='ap-northeast-1:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx', # プールID の IDプールのID 
        Logins={'login.mycompany.myapp': 'test_user'}, 
        # { 認証プロバイダ > カスタム > 開発者プロバイダーの名前 で登録した開発プロバイダーの名前: 独自認証したユーザID } 
    ) 
 
    client2 = boto3.client('sts') 
    ret = client2.assume_role_with_web_identity( 
        RoleArn='arn:aws:iam::xxxxxxxxxxxx:role/service-role/lambda_role', 
        RoleSessionName='boto', 
        WebIdentityToken=response['Token'], 
    ) 
    print(f"assumeRoleWithWebIdentity:{ret}") 
 
    return {'statusCode': 200, 'body': json.dumps('Hello from Lambda!')} 


実際にクレデンシャルを発行してみる

Lambdaを実行させるだけです。

ログに下記が表示されます。

  • AccessKey
  • SceretAccessKey
  • SessionToken


注意事項


一時クレデンシャルを使ったリクエストの注意

一時クレデンシャルを使ったリクエストの注意


STSの実行権限付与

Lambdaを実行しているロールにSTSの権限を付与する必要があるので、該当ロールの
"信頼関係" > "信頼関係の編集"

で表示されるポリシーの中身に注意すること

{ 
  "Version": "2012-10-17", 
  "Statement": [ 
    { 
      "Effect": "Allow", 
      "Principal": { 
        "Service": "lambda.amazonaws.com", 
        "Federated": "cognito-identity.amazonaws.com" // ここ大事 
      }, 
      "Action": [ 
        "sts:AssumeRole", 
        "sts:AssumeRoleWithWebIdentity" // ここ大事 
      ] 
    } 
  ] 
} 


参考


関連

コメント

このブログの人気の投稿

投稿時間:2021-06-17 22:08:45 RSSフィード2021-06-17 22:00 分まとめ(2089件)

投稿時間:2021-06-20 02:06:12 RSSフィード2021-06-20 02:00 分まとめ(3871件)

投稿時間:2021-06-17 05:05:34 RSSフィード2021-06-17 05:00 分まとめ(1274件)