Aws lambda 如何将我的谷歌用户与aws cognito';s用户池而不知道用户';s谷歌';s潜艇

Aws lambda 如何将我的谷歌用户与aws cognito';s用户池而不知道用户';s谷歌';s潜艇,aws-lambda,google-oauth,amazon-cognito,Aws Lambda,Google Oauth,Amazon Cognito,我想将用户配置到我的用户池,并允许他们使用用户名+密码或谷歌的SSO,只要电子邮件匹配。当使用adminLinkProviderForUser链接他们时,我需要提供用户的google的SUB,我事先不知道。这是我的解决方案,我希望这对任何人都有帮助。如果有人有更好的解决方案,请告诉我: 在我的预注册Lambda中,我提取Google的SUB和电子邮件,查找用户并将其与AdminLinkProviderForUser链接,完成类似操作后,我返回错误中的MARGED_Google字符串。错误字符串在

我想将用户配置到我的用户池,并允许他们使用用户名+密码或谷歌的SSO,只要电子邮件匹配。当使用adminLinkProviderForUser链接他们时,我需要提供用户的google的SUB,我事先不知道。

这是我的解决方案,我希望这对任何人都有帮助。如果有人有更好的解决方案,请告诉我:

在我的预注册Lambda中,我提取Google的SUB和电子邮件,查找用户并将其与
AdminLinkProviderForUser
链接,完成类似操作后,我返回错误中的
MARGED_Google
字符串。错误字符串在回调url中发送到浏览器,我在浏览器中识别
MARGED\u GOOGLE
字符串,并告诉用户我们刚刚完成了对其帐户的marge,他需要重新登录。下次他登录时,链接就在那里,没有注册

const AWS = require("aws-sdk");
exports.handler = (event, context, callback) => {
  if (event.triggerSource === "PreSignUp_ExternalProvider") {
    if (event.userName.startsWith("Google_")) {
      AWS.config.update({ region: "us-east-2" });
      const COGNITO_CLIENT = new AWS.CognitoIdentityServiceProvider({
        apiVersion: "2016-04-18",
        region: "us-east-2"
      });

      const  adminGetUserParams = {
        UserPoolId: "<UserPoolId>" /* required */,
        Username: event.request.userAttributes.email /* required */
      };
      COGNITO_CLIENT.adminGetUser(adminGetUserParams, function(err, data) {
        if (err) {
          callback("no signed in", null);
        } else {
          // successful response
          const params = {
            DestinationUser: {
              /* required */
              ProviderAttributeValue: data.Username,
              ProviderName: "Cognito"
            },
            SourceUser: {
              /* required */
              ProviderAttributeName: "Cognito_Subject",
              ProviderAttributeValue: event.userName.substr(7),
              ProviderName: "Google"
            },
            UserPoolId: "<UserPoolId>" /* required */
          };
          COGNITO_CLIENT.adminLinkProviderForUser(params, (e, d) => {
            if (e) callback("no signed in", null);
            else {
              callback("MARGED_GOOGLE", null);
            }
          });
        }
      });
    } else {
      callback("no signed in", null);
    }
  } else {
    callback(null, event);
  }
};
const AWS=require(“AWS sdk”);
exports.handler=(事件、上下文、回调)=>{
if(event.triggerSource==“预签名\u外部提供程序”){
if(event.userName.startsWith(“谷歌”)){
AWS.config.update({地区:“us-east-2”});
const COGNITO_CLIENT=new AWS.CognitoIdentityServiceProvider({
apiVersion:“2016-04-18”,
地区:“美国东部-2”
});
常量adminGetUserParams={
UserPoolId:“/*必需*/,
用户名:event.request.userAttributes.email/*必需*/
};
COGNITO_CLIENT.adminGetUser(adminGetUserParams,函数(err,数据){
如果(错误){
回调(“未登录”,null);
}否则{
//成功响应
常量参数={
目的地用户:{
/*必需的*/
ProviderAttribute值:data.Username,
提供者名称:“Cognito”
},
SourceUser:{
/*必需的*/
ProviderAttribute名称:“Cognito_主题”,
ProviderAttribute值:event.userName.substr(7),
提供者名称:“谷歌”
},
UserPoolId:“/*必需*/
};
COGNITO_CLIENT.adminLinkProviderForUser(参数,(e,d)=>{
如果(e)回调(“未登录”,null);
否则{
回调(“MARGED_GOOGLE”,null);
}
});
}
});
}否则{
回调(“未登录”,null);
}
}否则{
回调(null,事件);
}
};