4
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

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

Last updated at Posted at 2019-01-19

概要

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" // ここ大事
      ]
    }
  ]
}

参考

関連

4
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?