amazon-web-services - AWS Cognito 服务 API?放大 => Javascript SDK Angular 应用程序

标签 amazon-web-services amazon-cognito aws-amplify

我使用 Amplify 进行身份验证,它似乎工作正常。现在我想使用用户池为 CRUD 设置一个管理应用程序。看来我必须离开 Amplify 并使用 JavaScript SDK 来使用适当的 api。

这是如何运作的? 我无法弄清楚如何将我在 Amplify 中收到的 token 放入 AWS.config 或它们应该去的任何地方。

这是一场多么大的斗争。文档中的代码似乎过时了,网上的一些建议更糟。我怀疑这是因为 Amplify 对象包含配置选项,我必须将它们带到 AWS.config 对象中。我在下面尝试过但失败了。 知道我需要做什么吗? 我相信这里的答案对许多 AWS 新手都会有用。

我的 Angular 应用程序中有此代码,但考虑的是 Lambda。我有一个带有 Node.js 的 EC2 服务器作为另一种选择。

这是我的 MBP 上的开发人员,但我正在将它与 AWS 集成。

使用下面的代码,我收到一条错误消息,其中部分包含:

Error in getCognitoUsers:  Error: Missing credentials in config
    at credError (config.js:345)
    at getStaticCredentials (config.js:366)
    at Config.getCredentials (config.js:375)

我插入到下面对象中的 JWT 是我的浏览器存储中的 AccessKeyID,我用于身份验证。

在 console.log cognitoidentityserviceprovider 我有这个对象,部分:
config: Config
    apiVersion: "2016-04-18"
    credentialProvider: null
    credentials: "eyJraWQiOiJwaUdRSnc4TWtVSlR...
    endpoint: "cognito-idp.us-west-2.amazonaws.com"
    region: "us-west-2"
    endpoint: Endpoint
        host: "cognito-idp.us-west-2.amazonaws.com"
        hostname: "cognito-idp.us-west-2.amazonaws.com"
        href: "https://cognito-idp.us-west-2.amazonaws.com/"

这些功能按顺序向下流动。我在正文中留下了一些变量,以防有人想知道如何从用户对象中获取这些数据。我在各种尝试构建对象中使用了它们,但也许这里不需要大多数。 all 从 Amplify 用户对象产生正确的结果。
import { AmplifyService }  from 'aws-amplify-angular';
import Amplify, { Auth  } from 'aws-amplify';
import { CognitoIdentityServiceProvider } from 'aws-sdk';
import * as AWS from 'aws-sdk';

@Injectable()
export class CognitoApisService {

  private cognitoConfig = Amplify.Auth.configure();  // Data from main.ts
  private cognitoIdPoolID = this.cognitoConfig.identityPoolId;
  private cognitoUserPoolClient = this.cognitoConfig.userPoolWebClientId;
  private cognitoIdPoolRegion = this.cognitoConfig.region;
  private cognitoUserPoolID = this.cognitoConfig.userPoolId;

...

constructor(
    private amplifyService: AmplifyService,
  ) { }

public getAccessToken() {

return this.amplifyService
  .auth()  // Calls class that includes currentAuthenticaedUser.
  .currentAuthenticatedUser()  // Sets up a promise and gets user session info.
  .then(user => {
    console.log('user: ', user);

    this.accessKeyId = user.signInUserSession.accessToken.jwtToken;


    this.buildAWSConfig();

    return true;
  })
  .catch(err => {
    console.log('getAccessToken err: ', err);
  });
}

public buildAWSConfig() {

    // Constructor for the global config.
    this.AWSconfig = new AWS.Config({
      apiVersion: '2016-04-18',
      credentials: this.accessKeyId,
      region: this.cognitoIdPoolRegion
    });

    this.cognitoidentityserviceprovider = new AWS.CognitoIdentityServiceProvider(this.AWSconfig);

    /*  This doesn't get creds, probably because of Amplify.
        this.cognitoidentityserviceprovider.config.getCredentials(function(err) {
          if (err) console.log('No creds: ', err);    // Error: Missing credentials
          else console.log("Access Key:", AWS.config.credentials.accessKeyId);
        });
    */

    console.log('cognitoidentityserviceprovider: ', this.cognitoidentityserviceprovider);

    this.getCognitoUsers();
}


public getCognitoUsers() {

    // Used for listUsers() below.
    const params = {
      UserPoolId: this.cognitoUserPoolID,
      AttributesToGet: [
        'username',
        'given_name',
        'family_name',
      ],
      Filter: '',
      Limit: 10,
      PaginationToken: '',
    };


    this.cognitoidentityserviceprovider.listUsers(params, function (err, data) {

      if
        (err) console.log('Error in getCognitoUsers: ', err); // an error occurred
      else
          console.log('all users in service: ', data);
    });
  }

最佳答案

一个问题是凭证需要来自 Amplify 的整个用户对象,而不仅仅是我上面显示的访问 token 。顺便说一下,我在 main.ts 中有 Cognito 设置。他们也可以进入environment.ts。更好的安全选项是将其迁移到服务器端。不知道如何做到这一点。

// Constructor for the global config.
this.AWSconfig = new AWS.Config({
  apiVersion: '2016-04-18',
  credentials: this.accessKeyId, // Won't work.
  region: this.cognitoIdPoolRegion
});

我的完整代码更简单,现在是可观察的。请注意我必须弄清楚的另一个主要问题。从 Amplify 导入 AWS 对象,而不是从开发工具包导入。见下文。

是的,这与当前的文档和教程背道而驰。如果您想了解有关最近如何变化的更多背景信息,即使在我正在研究它时,请参阅此 Github issue 的底部. Amplify 主要用于身份验证,而 JavaScript SDK 用于服务 API。

import { AmplifyService }  from 'aws-amplify-angular';
// Import the config object from main.ts but must match Cognito config in AWS console.
import Amplify, { Auth  } from 'aws-amplify';
import { AWS } from '@aws-amplify/core';
import { CognitoIdentityServiceProvider } from 'aws-sdk';
// import * as AWS from 'aws-sdk';  // Don't do this.

@Injectable()
export class CognitoApisService {

  private cognitoConfig = Amplify.Auth.configure();  // Data from main.ts

  private cognitoIdPoolRegion = this.cognitoConfig.region;
  private cognitoUserPoolID = this.cognitoConfig.userPoolId;

  private cognitoGroup;
  private AWSconfig;

  // Used in listUsers() below.
  private params = {
    AttributesToGet: [
      'given_name',
      'family_name',
      'locale',
      'email',
      'phone_number'
    ],
    // Filter: '',
    UserPoolId: this.cognitoUserPoolID
  };


  constructor(
    private amplifyService: AmplifyService,
  ) { }

public getCognitoUsers() {

    const getUsers$ =  new Observable(observer => {
      Auth
        .currentCredentials()
        .then(user => {
            // Constructor for the global config.
            this.AWSconfig = new AWS.Config({
              apiVersion: '2016-04-18',
              credentials: user,    //  The whole user object goes in the config.credentials field!  Key issue.
              region: this.cognitoIdPoolRegion
            });

            const cognitoidentityserviceprovider = new CognitoIdentityServiceProvider(this.AWSconfig);

            cognitoidentityserviceprovider.listUsers(this.params, function (err, userData) {
              if (err) {
                  console.log('Error in getCognitoUsers: ', err);
              } else {
                observer.next(userData);
              }
            });

        });

    });

    return getUsers$;

  }

让我们从一个组件调用这个服务。我将 JS 对象解析放在组件中,但现在,我离开了 console.log在这里让您开始并查看代码是否适用于您的应用程序。

  // Called from button on html component.
  public getAllCognitoUsers() {
    this.cognitoApisService.getCognitoUsers()
      .subscribe(userData => {
        console.log('data in cognito component: ', userData);
    })
  }

关于amazon-web-services - AWS Cognito 服务 API?放大 => Javascript SDK Angular 应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53597300/

相关文章:

android - 在 DynamoDB Map 中插入 java.lang.Object

amazon-web-services - AWS DynamoDB | AWS DynamoDB |如何查询两个日期之间的时间戳?

amazon-web-services - AWS Cognito - 重置用户 MFA

amazon-web-services - 放大未发送到 Lambda 触发器的 Auth.signIn() ClientMetadata

amazon-web-services - AWS Amplify CLI 创建无法访问的存储桶进行托管

amazon-web-services - 带有 Kops 的 AWS 上的 Kubernetes 集群 - NodePort 服务不可用

java - 快速查询包含键的表(DynamoDB 和 Java)

amazon-cognito - 如何将 AWS Cognito native 用户链接到联合用户

graphql - 在graphql模式中,如何创建相同模型的父/子关系?

android - Android 应用程序中的 AWS Amplify Cognito 身份验证错误