Javascript 使用Facebook登录AWS Cognito

Javascript 使用Facebook登录AWS Cognito,javascript,angular,aws-sdk,amazon-cognito,amazon-cognito-facebook,Javascript,Angular,Aws Sdk,Amazon Cognito,Amazon Cognito Facebook,我有一个角度为10的网站。我有一个AWS Lambda(ASP.NET Core 3.1),它使用AWS Cognito为使用电子邮件/密码的用户进行身份验证。但我想允许用户也使用Facebook(最终是谷歌)登录。在Facebook/Google场景中,我的想法是暂时不允许直接访问AWS服务(如S3等),而是通过承载令牌与我的另一个lambda交互。我有一个Cognito用户池,我为它创建了一个Facebook身份提供者和映射。我在某个地方读到我需要一个身份证。所以我创建了它,并将其作为提供商

我有一个角度为10的网站。我有一个AWS Lambda(ASP.NET Core 3.1),它使用AWS Cognito为使用电子邮件/密码的用户进行身份验证。但我想允许用户也使用Facebook(最终是谷歌)登录。在Facebook/Google场景中,我的想法是暂时不允许直接访问AWS服务(如S3等),而是通过承载令牌与我的另一个lambda交互。我有一个Cognito用户池,我为它创建了一个Facebook身份提供者和映射。我在某个地方读到我需要一个身份证。所以我创建了它,并将其作为提供商和Facebook放入我的Cognito用户池中

使用JavaScript代码:

loginWithFacebook = () => {
    const login$ = from(this.facebookService.login());
    login$.subscribe(
      (response: LoginResponse) => {
        console.log(response);
        this.facebookLoginToAWS(response);
      },
      error => {
        console.error(error);
      }
    );
  };
我可以得到一个Facebook认证回复,没问题。然后使用您在每个博客、Stack Overflow帖子甚至AWS文档中看到的代码(当然,替换我自己的IdenityPoolId):

我可以取回一个会话令牌(除了一大堆其他东西,比如accesKeyId、identityId和secretAccessKey)

但是我该如何处理会话令牌呢?也许我有点困惑,但我会想,因为Facebook字段和Cognito字段之间有一个映射,不知何故,Facebook用户会被迁移到Cognito用户池中,我可以为该用户为我的其他Lambda获取JWT令牌。但是在检查AWS仪表板之后,我可以在标识池中看到一个登录(我想),但是没有相应的用户池条目


我是否必须手动迁移它(使用AWS JavaScript SDK)?我不想使用放大库。我想错了吗?我是否以某种方式将会话令牌用作其他lambda的承载令牌?我是否需要以某种方式将此人添加为用户池用户?

您需要按照特定步骤在Cognito用户池中启用社会身份提供者。看见如果设置正确,注册Facebook的用户将自动添加到Cognito用户池中。如果您计划让用户访问AWS资源,那么最好也使用联邦身份(Cognito身份池)。谢谢。因此,我认为我已经正确配置了我的用户池。但是在阅读了文档之后,我似乎不得不调用登录端点。但是身体是什么样子的呢?令牌端点文档包含主体示例。此外,如果您查看令牌端点文档,它们会提到access_code字段。但我不这么认为。基于上面的代码,我应该在某个地方(比如在凭证对象中)拥有它吗?您需要按照特定的步骤在Cognito用户池中启用社会身份提供者。看见如果设置正确,注册Facebook的用户将自动添加到Cognito用户池中。如果您计划让用户访问AWS资源,那么最好也使用联邦身份(Cognito身份池)。谢谢。因此,我认为我已经正确配置了我的用户池。但是在阅读了文档之后,我似乎不得不调用登录端点。但是身体是什么样子的呢?令牌端点文档包含主体示例。此外,如果您查看令牌端点文档,它们会提到access_code字段。但我不这么认为。基于上面的代码,我应该在某个地方(比如在凭证对象中)拥有它吗?
private facebookLoginToAWS = (facebookResponse: LoginResponse) => {
    console.log('facebookLoginToAWS', facebookResponse);

      if (facebookResponse.status === 'connected' && facebookResponse.authResponse) { 

        AWS.config.credentials = new AWS.CognitoIdentityCredentials({
          IdentityPoolId: 'us-east-1:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx',
          Logins: { 'graph.facebook.com': facebookResponse.authResponse.accessToken }
        }, { 
          region: 'eu-west-1'
        });

        AWS.config.credentials.get((err) => {
          if (err) {
            return console.log("Error", err);
          }

          console.log("Cognito credentials", AWS.config.credentials);
          console.log("Cognito Identity Id", AWS.config.credentials.identityId);
        });

      } else if (facebookResponse.status === 'not_authorized') {
        document.getElementById('facebookStatus').innerHTML = 'Please log into this app.';
      } else {
        document.getElementById('facebookStatus').innerHTML = 'Please log into Facebook.';
      }
  };