1

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

使用 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):

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.';
      }
  };

我可以取回会话令牌(除了大量其他内容,如 accesKeyId、identityId 和 secretAccessKey)。

但是我该如何处理该会话令牌?也许我很困惑,但我认为因为 Facebook 字段和 Cognito 字段之间存在映射,所以 Facebook 用户会以某种方式迁移到 Cognito 用户池中,我可以为我的其他 lambdas 获取该用户的 JWT 令牌。但是在检查 AWS 仪表板后,我可以在身份池中看到登录(我认为),但没有相应的用户池条目。

在此处输入图像描述

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

4

0 回答 0