在 AWS lambda 上列出 cognito userpool 用户

Posted

技术标签:

【中文标题】在 AWS lambda 上列出 cognito userpool 用户【英文标题】:Listing cognito userpool users on AWS lambda 【发布时间】:2020-03-19 09:53:28 【问题描述】:

我试图在我的 lambda 函数中列出我所有的 cognito 用户,但是我在返回中什么也没得到,就好像回调没有被执行一样。我做错了什么?

下面代码的输出只是在控制台中打了个招呼。

var AWS = require("aws-sdk");

const cognitoidentityserviceprovider = new AWS.CognitoIdentityServiceProvider();
export async function main() 
console.log("hello")
  var params = 
    UserPoolId: "myuserpoolid",
    AttributesToGet: ["username"]
  ;

  cognitoidentityserviceprovider.listUsers(params, (err, data) => 
    if (err) 
      console.log(err, err.stack);
      return err;
     else 
      console.log(data);
      return data;
    
  );

【问题讨论】:

尝试删除函数中的 async 关键字 【参考方案1】:

首先,代码的结构是错误的。 Lambda 函数的头部应该有一定的结构,要么使用异步函数,要么使用非异步函数。由于您在示例中使用了非异步代码,因此我将向您展示如何执行后面的操作。

var AWS = require("aws-sdk");

const cognitoidentityserviceprovider = new AWS.CognitoIdentityServiceProvider();

exports.handler =  function(event, context, callback) 
  console.log("hello")
  var params = 
    UserPoolId: "myuserpoolid",
    AttributesToGet: ["username"]
  ;

  cognitoidentityserviceprovider.listUsers(params, (err, data) => 
    if (err) 
      console.log(err, err.stack);
      callback(err)        // here is the error return
     else 
      console.log(data);
      callback(null, data) // here is the success return
    
  );

在这种情况下,Lambda 将仅在调用 callback 时(或超时)完成。

同样,您可以使用异步功能,但您需要相应地重组您的代码。这是取自official docs 的示例。请注意如何使用 promise 包装器。

const https = require('https')
let url = "https://docs.aws.amazon.com/lambda/latest/dg/welcome.html"

exports.handler = async function(event) 
  const promise = new Promise(function(resolve, reject) 
    https.get(url, (res) => 
        resolve(res.statusCode)
      ).on('error', (e) => 
        reject(Error(e))
      )
    )
  return promise

【讨论】:

【参考方案2】:

对于 AttributesToGet,不要使用用户名,因为它是始终返回的字段之一。以下是 Attributes 数组的成员,可以在 AttributesToGet 字段中使用:

sub、email_verified、phone_number_verified、phone_number、email。

例如

AttributesToGet: ["email","email_verified"]

【讨论】:

以上是关于在 AWS lambda 上列出 cognito userpool 用户的主要内容,如果未能解决你的问题,请参考以下文章

AWS API Gateway + Cognito 用户池授权方 + Lambda - 我需要设置哪些 HTTP 标头和权限?

AWS Lambda、API 网关和 Cognito:如何在 lambda 函数中获取身份对象?

如何在 API 网关上的 cognito 授权方保护的 lambda 函数中获取 AWS Cognito 用户数据

在 AWS Cognito 和 Lambda 中获取 Facebook 访问令牌

在 DotNet 中创建 AWS Cognito PreSignup Lambda

AWS Cognito lambda 触发两次