当前位置: 首页 > 知识库问答 >
问题:

AWS Cognito AdminLinkProviderForUser-用户池帐户和Facebook

壤驷华美
2023-03-14

我们的设置是:

  • 创建电子邮件/密码帐户或登录Facebook

我能够创建两个成功独立于彼此与AWS Cognito。

我想解决的问题是,如果用户先有一个电子邮件/密码帐户,然后单击Facebook登录,我希望他们链接并提示用户确认他们有权访问该电子邮件/密码帐户。

一旦用户确认以后,他们应该能够登录Facebook或通过电子邮件/密码登录来访问和调整相同的帐户。

Facebook用户在Cognito用户池:-Facebook用户在Cognito用户池

Cognito用户池中链接到Facebook用户的电子邮件/密码用户:Cognito用户池中链接到Facebook用户的电子邮件/密码用户

我目前正在使用预注册触发器来自动验证电子邮件、确认和链接帐户。对于社交网站(Facebook),我使用:

GET amazoncognito.com/oauth2/authorize?identity_provider=Facebook&response_type=code then

POST amazoncognito.com/oauth2/token

这是可行的,但我作为Facebook_用户进行身份验证,我的期望(和希望)是在那时作为链接用户进行身份验证。我觉得我错过了一些明显的东西。

共有1个答案

丁曦哲
2023-03-14

最终,答案是我没有从用户ID中删除Facebook。因此,理论上,我把我的Cognito电子邮件/密码链接到了“Facebook_USERID”,而不是“USERID”

一旦我做了更改,我就可以作为1个链接帐户进行身份验证。

// Get Email
        var params = {
          UserPoolId: 'YOUR_USER_POOL',
          AttributesToGet: ['sub','email'],
          Filter: "email = \"" + event.request.userAttributes.email + "\""
        }
        cognito.listUsers(params, (err, data) => {
            if (err) {
                console.log(err, err.stack);
            }
            else {
                console.log(data);
                console.log(event.userName);
                if(data != null && data.Users != null && data.Users[0] != null)
                {
                  console.log(data.Users[0].Username);
                  var params = {
                    DestinationUser: { 
                      ProviderAttributeValue: data.Users[0].Username,
                      ProviderName: 'Cognito'
                    },
                    SourceUser: { 
                      ProviderAttributeName: 'Cognito_Subject',
                      ProviderAttributeValue: event.userName.split("_")[1],
                      ProviderName: 'Facebook'
                    },
                    UserPoolId: 'YOUR_USER_POOL'
                  };
                  cognito.adminLinkProviderForUser(params, function(err, data) {
                    if (err) console.log(err, err.stack); // an error occurred
                    else     console.log(data);           // successful response
                  });
                }
            }
        });

更新日期:2020年4月24日

我们为所有注册用户添加了一个本地帐户,这样我们就不会遇到问题。如果他们试图通过本机登录,只需激活/重置密码。以下脚本位于我们的预注册触发器Lambda函数中:

  {
    // ExternalProvider (ie. Social)
    if (event.request.userAttributes.hasOwnProperty("email")) {
      // Create Native User Always
      var params = {
        ClientId: backendClientIds[event.userPoolId],
        Password: generatePassword(),
        Username: event.request.userAttributes.email
      };
      cognito.signUp(params, function(err, data) {
        if (err) { 
          console.log('cognito.signUp:');
          console.log(err, err.stack); 
          if(err.code === 'UsernameExistsException')
          {
            // Get and Link Existing User
            getUsersAndLink(event.userPoolId, event.request.userAttributes.email, event);
          }
        }
        else {
          console.log('cognito.signUp:');
          console.log(data);
          if(data.UserConfirmed)
          {
            // Link Newly Created User
            linkUser(data.UserSub, event);
          }
        }
      });
    }
  }

如果有帮助的话,这里有完整的lambda代码:https://pastebin.com/4cyF9Nkw

 类似资料:
  • 我正在构建一个Java Web应用程序,当经理批准他们的请求时,它会自动授予用户对其Windows PC的管理权限。 为了实现这一点,我将编写一个脚本来自动远程访问用户的计算机,并将他们添加到计算机的管理组中。我想为了做到这一点,我需要一个管理服务帐户来访问所有的计算机。 我的问题是,我如何安全地存储管理服务帐户信息?应用程序每次需要访问并授予用户管理员权限时都需要凭据,那么我如何让应用程序在没有

  • 我正在尝试使用Active Merchant和active_paypal_adaptive_paymentgem集成Paypal Adaptive结账。在用户注册期间,用户需要注册他/她的PayPal帐户才能在交易期间收到付款。 我已经为activemerchant设置了所有凭据。在paypal中注册用户帐户时,我遇到以下错误。 您正在登录此事务的API调用方的帐户。请更改您的登录信息,然后重试。

  • 我正在使用node.sdk、stormpath、express.js和passport.js为我的新网站制作一个用户帐户系统。所以我设置了一个自定义数据槽的帐户。我想知道,当他们注销时,我如何将新数据发布到这个自定义数据槽中,并在他们登录时检索它。我对使用node是新手,我不知道在他们登录时,我的代码应该放在哪里,也不知道如何访问“用户”帐户信息。据我所知,Passport.js正在处理身份验证,

  • Contributed by Neil Blakey-Milner. 14.1. 概述 FreeBSD允许多个用户同时使用计算机. 当然,这些用户中不是很多人同时坐在同一台计算机前.[6],而是其他用户可以通过网络来使用同一台计算机以完成他们的工作.要使用系统,每个人都应该有一个帐户. 读完这章,您将了解到: 在一个FreeBSD系统上不同用户帐户之间的区别. 如何添加用户帐户. 如何删除用户帐户

  • 是否可以使用java代码创建/删除windows用户帐户并设置其权限以使其成为管理员帐户、简单用户帐户或来宾帐户?

  • 我需要阻止用户访问Keycloak帐户客户机(/auth/realms/[MYREALM]/Account),但我需要这个客户机提供的Rest API。 我用的是Keycloak 4.1.0。我试图通过keycloak管理面板(/auth/admin/master/console/#/realms/[MYREALM]/clients)禁用account client,但是如果禁用此客户端,acco