通过 AWS Lambda 和 Cognito 注册用户(无服务器架构)

Posted

技术标签:

【中文标题】通过 AWS Lambda 和 Cognito 注册用户(无服务器架构)【英文标题】:SignUp User via AWS Lambda & Cognito (Serverless Architecture) 【发布时间】:2017-11-12 00:28:36 【问题描述】:

我在身份验证方法中使用 无服务器框架。我的目标是创建一个 API 端点来触发(通过 AWS API 网关)创建新 AWS Cognito 用户的 Lambda 函数。端点将有一个自定义授权器来保护它。

我的 Lambda 函数如下。当它运行时,我收到错误“NotAuthorizedException: SignUp is not allowed for this user pool”。关于如何授权我的 Lambda 函数创建新用户的任何想法?

'use strict';

var AmazonCognitoIdentity = require('amazon-cognito-identity-js');
var CognitoUserPool = AmazonCognitoIdentity.CognitoUserPool;
var CognitoUserAttribute = AmazonCognitoIdentity.CognitoUserAttribute;

module.exports.init = (event, context, callback) => 

  console.log('Lambda initiated with event:',event);

  // Define AWS Cognito User Pool
  var poolData = 
    "UserPoolId": process.env['COGNITO_USER_POOL_ID'],
    "ClientId": process.env['COGNITO_APP_CLIENT_ID']
  ;
  var userPool = new CognitoUserPool(poolData);
  console.log('userPool:',userPool);

  // Define User Attributes
  var attributeList = [];
  var dataEmail = 
    "Name": "email",
    "Value": "email@example.com"
  ;
  var attributeEmail = new CognitoUserAttribute(dataEmail);
  attributeList.push(attributeEmail);
  console.log('attributeList:',attributeList);

  // Create User via AWS Cognito
  userPool.signUp('username', 'password', attributeList, null, function(err, result) 
    if(err) 
      console.log('err:',err);
      callback(err,null);
     else 
      console.log('result:',result);
      cognitoUser = result.user;
      console.log('user name is ' + cognitoUser.getUsername());
      callback(null,result);
    
  );

;

【问题讨论】:

【参考方案1】:

“NotAuthorizedException: SignUp is not allowed for this user pool”当用户池只允许管理员通过 AdminCreateUser API 创建用户时抛出异常。启用此设置后,无法调用 SignUp API 并会引发此错误。

如果您从 lambda 触发器调用它,您可以使用 AdminCreateUser API 或禁用此设置,以便您的用户池允许 SignUp API 调用。

【讨论】:

【参考方案2】:

正如Chean Mehta 指出的那样,您可以禁用 AdminCreateUser 设置以使 SignUp API 正常工作,因为您必须在无服务器认知配置中将 AllowAdminCreateUserOnly 设置为 false,或者您可以按照以下步骤禁用此设置:

    转到您的 cognito 控制台。 选择您的用户池。 在常规设置下选择策略。 选择允许用户自己注册 并保存更改

【讨论】:

以上是关于通过 AWS Lambda 和 Cognito 注册用户(无服务器架构)的主要内容,如果未能解决你的问题,请参考以下文章

通过 Cognito 生成的授权令牌识别 AWS Lambda 中的用户

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

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

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

如何在没有授权人的情况下通过 API Gateway 使 AWS Cognito 用户数据可供 Lambda 使用?

操作方法:使用 AWS Cognito 进行 C# .net 核心 API (APIGateway/Lambda) + Xamarin + Facebook 身份验证