Help us understand the problem. What is going on with this article?

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

More than 1 year has passed since last update.

概要

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

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

環境

  • 公式フローだと、AssumeRoleWithWebIdentity はクライアントからやることになっていますが、面倒くさいので、Lambdaの中で完結させます。
  • 独自認証の認証自体はやりません。
    ※認証できているという前提で、GetOpenIdTokenForDeveloperIdentity からやります。
     実際には GetOpenIdTokenForDeveloperIdentity の前に独自認証の処理が必要です。
  • Lambdaのロールには FullAccess をつけます。
    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')
    # reponseのTokenにはIDトークンが入る
    # ※備考
    # "iss": "https://cognito-identity.amazonaws.com" になる。
    # ユーザプールで発行した場合の"iss"は"https://cognito-idp.ap-northeast-1.amazonaws.com/ap-northeast-1_xxxxxxxx(ユーザプールID名)"になる
    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" // ここ大事
      ]
    }
  ]
}

参考

関連

k_hoso
記事のまとめは↓のサイトリンクから。 とりあえずevernoteにまとめていた備忘録メモを徐々にQiitaに転載していく感じ。ネタとしてひとまとめにしているものはちゃんと個別の記事にしていきたい、いつか。。ざくっとした記事もちゃんとした記事にできればいいけど、それもいつか。。 ※↓のリンクはQiita記事の目次
https://qiita.com/k_hoso/private/3c883802aa6baf9a6269
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away