lambda 无服务器上的身份验证和用户创建

Authentication and user creation on lambda serverless

我创建了一个 Lambda REST api(使用无服务器)来访问 Dynamodb 数据库并执行 CRUD 操作。

然后我附加了一个 CognitoUserPool 和一个 CognitoUserClient 以及 ApiGatewayAuthorizer

那么我现在面临的问题是,为了识别我正在使用这样的一些终端命令:

aws cognito-idp sign-up \
  --region myregion \
  --client-id clientid \
  --username username \
  --password mypassword

然后我运行:

aws cognito-idp admin-confirm-sign-up \
  --region myregion \
  --user-pool-id userpooolid \
  --username username

终于得到我的代币 运行

aws cognito-idp admin-initiate-auth --cli-input-json file://auth.json

其中 json 包含:

{
   "UserPoolId":"myregion",
   "ClientId":"myclientid",
   "AuthFlow":"ADMIN_NO_SRP_AUTH",
   "AuthParameters":{
      "USERNAME":"username",
      "PASSWORD":"password"
   }
}

这在终端上给了我一个令牌,然后我(手动)将其复制到 Postman

我在哪里测试 API。

我怎样才能使这一切自动进行并以编程方式编写脚本? 我也希望用户注册然后进行身份验证。

我查看了一些无服务器示例(在 Python 中),但他们使用的是 Auth0,我想继续使用 AWS 资源。

有什么想法吗?或者我可以适应我的需要的代码?

要以编程方式实现相同的行为, 您首先需要决定要使用哪个SDK。

对于 python 用户,您应该使用 boto3,这是 python 的 AWS SDK。

更具体地说,要实现完整的注册过程,您可以使用等效的 boto3 sign_up, confirm_sign_up, admin_initaiate_auth

如您所见,这些函数在名称上非常相似,在 request/response 语法中也是如此。

关于完整代码,这没有经过测试,但它基于 AWS 示例代码。

import boto3
from botocore.exceptions import ClientError


def sign_up(app_client_id, username, password):
    client = boto3.client('cognito-idp')

    try:
        sign_up_response = client.sign_up(
                ClientId=app_client_id,
                Username=username,
                Password=password
        )
        print(sign_up_response)

        confirm_sign_up_response = client.admin_confirm_sign_up(
                UserPoolId=deadpool['user_pool_id'],
                Username=deadpool['username']
        )
        print(confirm_sign_up_response)

     except ClientError as e:
         print(e)


def init_auth(app_client_id, username, password):
    client = boto3.client('cognito-idp')

    response = client.initiate_auth(
            AuthFlow='USER_PASSWORD_AUTH',
            AuthParameters={
                'USERNAME': username,
                'PASSWORD': password
            },
            ClientId=app_client_id
    )

    print(response['AuthenticationResult']['AccessToken'])
    print(response['AuthenticationResult']['IdToken'])
    print(response['AuthenticationResult']['RefreshToken'])

如您所见,有 3 种类型的标记,要更好地理解,请参阅 here