【问题标题】:Authentication and user creation on lambda serverlesslambda serverless 上的身份验证和用户创建
【发布时间】:2024-05-18 09:55:01
【问题描述】:

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

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

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

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 资源。

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

【问题讨论】:

    标签: python amazon-web-services amazon-cognito serverless


    【解决方案1】:

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

    对于 python 用户,您应该使用boto3,它是适用于 python 的 AWS 开发工具包。

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

    如您所见,这些函数的名称非常相似,请求/响应语法也是如此。

    关于完整代码,此代码未经测试,但基于 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

    【讨论】:

      最近更新 更多