4

新用户注册时如何发送电子邮件/触发 lambda 函数?

在“编辑身份池”下,我只找到了一个同步触发器。如果我理解正确:每次用户同步他的数据时都会触发这个......
有没有办法只为“初始”同步或为用户创建某个数据集时触发 lambda 函数?

在此处输入图像描述

编辑:
更具体地说:我确实使用 JS SDK 通过 lambdas 创建用户。我将开发人员身份验证与我自己的 oauth2 流程一起使用。我不知道如何区分第一次通过谷歌授予访问权限的用户与第二次这样做的人。带有访问代码的json对我来说是一样的……也许我弄错了。

同样使用该getOpenIdTokenForDeveloperIdentity调用,我不知道如何区分 cognito 的新 ID 和一个 cognito 已经知道的 ID。

编辑2:更准确地说:我正在建立这个项目:https ://github.com/laardee/serverless-authentication-boilerplate/blob/master/authentication/lib/storage/usersStorage.js

这是我目前如何将用户保存到 cognito 的方法。我确实为第一次用户和第 n 次用户运行此代码。我的问题是我不知道如何区分......

const saveCognito = (profile) => new Promise((resolve, reject) => {
  if (profile) {
    cognitoidentity.getOpenIdTokenForDeveloperIdentity({
      IdentityPoolId: process.env.COGNITO_IDENTITY_POOL_ID,
      Logins: {
        // profile.userId = encrypted id of the e.g. google oauth2 id
        [process.env.COGNITO_PROVIDER_NAME]: profile.userId 
      }
    }, (err, dat) => {
      if (err) {
        reject(err);
      } else {
        var list_params = {
          DatasetName: 'user-data', /* dataset name */
          IdentityId: dat.IdentityId, /* cognito id */
          IdentityPoolId: process.env.COGNITO_IDENTITY_POOL_ID
        };
        cognitosync.listRecords(list_params, function(err, data) {
          if (err) {
            reject(err); // an error occurred
          } else {

            var RecordPatches = //[Parts of the i want to write to the user]
            // SyncSessionToken is returned by the cognitosync.listRecords call
            list_params["SyncSessionToken"] = data.SyncSessionToken; 
            list_params["RecordPatches"] = RecordPatches;

            cognitosync.updateRecords(list_params, function(err, update_data) {
              if (err){
                reject(err);
              } else {
                resolve();
              }
            });
          }
        });
      }
    });
  } else {
    reject('Invalid profile');
  }
});
4

1 回答 1

3

所以这是目前 Cognito 开箱即用不支持的东西。您说得对,唯一会触发 Lambda 函数的内置 Cognito 事件是“同步触发器”事件。每次 Cognito IdentityId 将他们的一些数据同步到 Cognito Sync 云数据存储时,都会触发此 Sync 事件。

此事件与 Cognito Federated Identity 创建新的 IdentityId 无关。

理论上你可以:

  • 在用户登录之前,在 IdentityPool 上运行 list-identities 调用。
  • 登录用户。检查已提供给用户的 IdentityId 是否存在于您在登录之前检索到的列表中。这将告诉您在此登录之前提供给用户的身份是否存在。
  • 根据此信息,您可以决定是否以编程方式从您的应用程序调用 Lambda 函数。

上述设置会很复杂,出于安全原因,您需要在服务器端维护此服务。list-identities 调用需要 AWS 凭证才能调用。而且我怀疑您是否希望在您的 IAM 策略中为未经身份验证的用户包含该调用的权限。

除了上述之外,您目前无能为力。为此,您需要设置一个 DynamoDB 表(或一些类似的低延迟数据存储),您可以在其中维护 IdentityId 列表的状态,然后在您登录用户时查询此服务/存储以比较新登录预先存在的列表。

如果这对您的使用案例至关重要,我建议您前往 AWS Support,并创建一个案例,您可以将其记录为功能请求。

https://aws.amazon.com/premiumsupport/

于 2016-12-26T16:02:27.487 回答