4

如何在新用户注册时发送电子邮件/触发lambda函数?用户注册时发送电子邮件 - AWS Cognito联合身份验证

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

enter image description here

编辑:
更具体:我确实创造了通过使用JS SDK lambda表达式的用户。我使用我自己的oauth2流进行开发人员身份验证。我不知道如何区分授予访问权限的用户第一次来自有人在第二次这样做。具有访问代码的json对我来说也是一样的......也许我错了。

也使用getOpenIdTokenForDeveloperIdentity调用我不知道如何区分一个认知的新ID与一个认知已知的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'); 
    } 
}); 
+0

我认为实际的用户创建不是lambda表达式? – Erndob

+0

@Erndob看到我的编辑/扩展问题 – Rentrop

+0

要创建的用户,你有一个lambda是将它们添加到池中,它是从登录不同的,你就不能触发电子邮件从你注册拉姆达发送拉姆达? – Erndob

回答

3

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

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

理论上你可以:

  • 运行列表的身份呼吁IdentityPool,用户登录 在
  • 登录用户之前。在登录 之前,请检查给予用户的IdentityId是否存在于您检索的列表中。这会告诉您在登录之前是否存在他们的身份 。
  • 根据此信息,您可以 决定是否以编程方式从您的应用程序调用Lambda 函数。

上述设置将会很复杂,因为您需要在服务器端维护此服务,因此出于安全原因。列表标识调用需要AWS凭据进行调用。我怀疑你想在未经身份验证的用户的IAM策略中包含该调用的权限。

除了上述以外,目前没有太多可以做的事情。 为了做到这一点,你需要安装一个DynamoDB表(或一些类似的低延迟数据存储),在那里你可以保持IdentityId列表的状态,然后查询该服务/存储,只要你登录用户比较新的登录到已有的列表。

如果这是你的使用情况危急我建议标题到AWS支持,创造在这里你可以登录这是一个功能要求的情况下。

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

+0

感谢您的答案。太糟糕了,它没有实现(还?)。我正在测试cognito以在项目中使用它。这是我的工作流程,但是作为一个学生不幸关键我没有访问premiumsupport ... :( 唯一的替代解决方案,你的建议,我能想到的: 如果'listRecords'返回一个空集=>用户我们新=>发送电子邮件 这应该工作,因为我做安全的__ profile__例如来自谷歌收集每个用户信息。所以我所有的用户将有'用户data'记录 – Rentrop

+1

这是一个很好的解决方案也检查数据集,看看它是否为空,然后将一些数据粘贴到记录中,以表示用户不是新的。是的,我去过那里,我曾经是一名学生,曾经做过这件事,所以我知道它的感觉:) –

相关问题