Amazon Cognito でユーザーを自動的に確認する方法を教えてください。

所要時間3分
0

ユーザーを確認し、ワンタイムパスワード (OTP) を使用せずに自動的に E メールアドレスと電話番号を確認したいと考えています。

簡単な説明

ユーザーが Amazon Cognito ユーザープールにサインアップする場合、通常、E メールアドレスまたは電話番号を確認する必要があります。通常、認証のためユーザーの E メールアドレスまたは電話番号にワンタイムパスワードを送信します。OTP 認証なしでユーザーを自動的に確認することもできます。

OTP を使用せずに、ユーザーの E メールアドレスまたは電話番号を使用してユーザーを自動的に確認する手順の大まかな手順は次のとおりです。

  • AWS Lambda 関数を作成します。
  • サインアップ前の Lambda トリガーを使用して Amazon Cognito ユーザープールを作成します。
  • Amazon Cognito でユーザーをサインアップします。AWS マネジメントコンソールまたは AWS API を使用してユーザー属性を確認します。

解決方法

OTP 検証なしでユーザーとその属性を自動的に確認するには、次の手順に従います。

Lambda 関数を作成する

1.    Amazon Cognito イベントを使用して、Amazon Cognito ユーザーを作成するイベントを処理する Lambda 関数を作成します。次の Python コードは、ユーザーとその属性 (E メールアドレスや電話番号など) を確認します。

Python ユーザー確認コードの例:

import json

def lambda_handler(event, context):

  # Confirm the user
  event['response']['autoConfirmUser'] = True

  # Set the email as verified if it is in the request
  if 'email' in event['request']['userAttributes']:
    event['response']['autoVerifyEmail'] = True

  # Set the phone number as verified if it is in the request
  if 'phone_number' in event['request']['userAttributes']:
    event['response']['autoVerifyPhone'] = True

  # Return to Amazon Cognito
  return event

2.    サインアップ前の Lambda トリガーに関連するデータを使用して、Lambda 関数にテストイベントを設定します。次の例には、ステップ 1 のサンプル Python コードのテストイベントが含まれています。

JSON テストイベントの例:

{
  "request": {
    "userAttributes": {
      "email": "email@example.com",
      "phone_number": "5550100"
    }
  },
  "response": {}
}

Amazon Cognito ユーザープールを作成する

1.    新しい Amazon Cognito ユーザープールを作成するか、既存のユーザープールを選択します。

2.    選択したユーザープールで、作成した Lambda 関数を選択して、サインアップ前の Lambda トリガーを追加します

サインアップ前の Lambda トリガーを使用して、カスタムロジックを追加し、新しいユーザーを検証できます。新しいユーザーがアプリにサインアップすると、Amazon Cognito はそのイベント情報を Lambda 関数に渡します。(Lambda 関数の例は [Lambda 関数を作成] セクションのステップ 1 にあります)。 Lambda 関数は、レスポンスに変更を加えた同じイベントオブジェクトを Amazon Cognito に返します。以下は、[Lambda 関数を作成] セクションのステップ 2 のテストイベントの出力応答です。

JSON テストイベントレスポンスの例:

{
  "request": {
    "userAttributes": {
      "email": "email@example.com",
      "phone_number": "5550100"
    }
  },
  "response": {
    "autoConfirmUser": true,
    "autoVerifyEmail": true,
    "autoVerifyPhone": true
  }
}

注: 新しいユーザーが既存の電話番号または E メールアドレスのエイリアスでサインアップすると、エイリアスは新しいユーザーに移動します。次に、前のユーザーの電話番号または E メールアドレスが未確認としてマークされます。このような変更を防ぐには、ListUsers API を呼び出して、ユーザープールのすべてのユーザーの属性を一覧表示します。既存のユーザー属性を確認し、新しいユーザー属性と比較して、予期しない変更が行われていないことを確認します。

5.    サインアップ前の Lambda トリガーがユーザープールで設定されていることを確認します。

Amazon Cognito ユーザーをサインアップする

Amazon Cognito がホストする UI を使用するか、SignUp API を呼び出して、新規ユーザーとしてサインアップします。

Amazon Cognito がホストする UI を使用する

1.    Amazon Cognito がホストする UI で、新しいユーザーとしてサインアップします。必須の属性をすべて入力してください。次に、サインアップした後、検証なしで callback URL に移動します。

2.    ユーザー属性を確認します

  • アカウントステータス: 有効/確認済み
  • email_verified: true
  • phone_number_verified: true

AWS CLI を使用する

1.    AWS コマンドラインインターフェイス (AWS CLI) で、SignUp API を呼び出してユーザーを作成します。

重要: AWS CLI コマンドの例では、サンプル文字列のすべてのインスタンスを自分の値に置き換えてください。(例えば、「example_client_id」 を自分のクライアント ID に置き換えてください)。

sign-up コマンドの例:

$ aws cognito-idp sign-up --client-id example_client_id --secret-hash example_secret_hash --username example_user_name --password example_password --user-attributes Name="email",Value="email@example.com" Name="phone_number",Value="5550100"

2.    アプリケーションクライアント ID、クライアントシークレット、および Amazon Cognito ユーザープール内のユーザーのユーザー名を使用して、シークレットハッシュを計算します

3.    Python をインストールする

4.    次のサンプルの Python スクリプトを .py ファイルとして保存します。

重要: サンプルスクリプトを実行する前に、次の値を置き換えてください。[ユーザー名] には、ユーザープール内のユーザーのユーザー名を入力します。[AppClientId] には、ユーザープールのアプリケーションクライアント ID を入力します。次に、[AppClientSecret] には、アプリケーションクライアントシークレットを入力します。ヘルプについては、$ python3 secret_hash.py –help コマンドを実行してください。

Python スクリプトの例:

import base64, hashlib, hmac, argparse

parser = argparse.ArgumentParser()
parser.add_argument("--username", required=True)
parser.add_argument("--appclientid", required=True)
parser.add_argument("--appclientsecret", required=True)
args = parser.parse_args()

message = bytes(args.username + args.appclientid, 'utf-8')
key = bytes(args.appclientsecret, 'utf-8')
secret_hash = base64.b64encode(hmac.new(key, message, digestmod=hashlib.sha256).digest()).decode()

print('SecretHash: {}'.format(secret_hash))

5.    次のコマンドを使用して、Python スクリプトから計算されたシークレットハッシュを取得します。

コマンド例:

$ python3 secret_hash.py --username example_user_name --appclientid example_app_client_id --appclientsecret example_app_client_secret

自動確認されたユーザーの例

1.    ユーザー名、アプリケーションクライアント ID、クライアントシークレットを使用する Python スクリプトを実行して、シークレットハッシュを生成します。

$ python3 secret_hash.py --username example_user_name --appclientid 11122223333 --appclientsecret je7MtGbClwBF/2Zp9Utk/h3yCo8nvbEXAMPLEKEY

出力:

SecretHash: wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY

2.    SignUp API を呼び出して Amazon Cognito ユーザーを作成します。

$ aws cognito-idp sign-up --client-id 7morqrabcdEXAMPLE_ID --secret-hash wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY = --username example_user_name --password Password1@ --user-attributes Name='email',Value='email@example.com' Name='phone_number',Value='5550100'

出力:

{
  "UserConfirmed": true,
  "UserSub": "a1b2c3d4-5678-90ab-cdef-EXAMPLE11111"
}

3.    ユーザー属性のステータスを確認するには、AdminGetUser API を呼び出します。

$ aws cognito-idp admin-get-user --user-pool-id us-east-1_I 111122223333 --username example_user_name

出力:

{
  "Username": "example_user_name",
  "UserAttributes": [
    {
      "Name": "sub",
      "Value": "a1b2c3d4-5678-90ab-cdef-EXAMPLE11111"
    },
    {
      "Name": "email_verified",
      "Value": "true"
    },
    {
      "Name": "phone_number_verified",
      "Value": "true"
    },
    {
      "Name": "phone_number",
      "Value": "5550100"
    },
    {
      "Name": "email",
      "Value": "email@example.com"
    }
  ],
  "UserCreateDate": "2022-12-12T11:54:12.988000+00:00",
  "UserLastModifiedDate": "2022-12-12T11:54:12.988000+00:00",
  "Enabled": true,
  "UserStatus": "CONFIRMED"
}

最後の出力は、E メールアドレスと電話番号の属性が検証されたことを示しています。ユーザーステータスは、外部検証なしで「確認済み」に設定されます。


AWS公式
AWS公式更新しました 1年前
コメントはありません

関連するコンテンツ