API сервисов AWS Cognito?Amplify => Javascript SDK Угловое приложение - PullRequest
0 голосов
/ 03 декабря 2018

Я использовал Amplify для аутентификации и, похоже, работает нормально.Теперь я хочу настроить приложение администратора для CRUD с пулом пользователей.Кажется, мне нужно выйти из Amplify и использовать JavaScript SDK, чтобы использовать соответствующие API.

Как это работает? Мне не удалось выяснить, как получить токены, которые я получаюв Amplify в AWS.config или куда бы они ни пошли.

Какая это была борьба.Кажется, что код в документах устарел и что мало советов в Интернете хуже.Я подозреваю, что это потому, что объект Amplify содержит параметры конфигурации, и я должен перенести их в объект AWS.config.Я попробовал ниже и потерпел неудачу. Есть идеи, что мне нужно сделать? Я уверен, что ответы здесь будут полезны для многих новичков AWS.

У меня есть этот код в моем приложении Angular, но я думаю о Lambda.У меня есть сервер EC2 с Node.js в качестве другого варианта.

Это для dev на моем 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/"

Эти функции передаются в виде последовательности.Я оставил несколько переменных в телах на случай, если кто-то захочет узнать, как получить эти данные от объекта пользователя.Я использовал их в различных попытках создания объектов, но большинство из них здесь не нужно, возможно.Все они дают правильные результаты из пользовательского объекта 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);
    });
  }

1 Ответ

0 голосов
/ 09 декабря 2018

Единственная проблема состояла в том, что учетным данным нужен весь пользовательский объект из Amplify, а не только токен доступа, как я показал выше.Кстати, у меня есть настройки Cognito в main.ts.Они могут также пойти в 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
});

Мой полный код стал проще и теперь поддается наблюдению.Обратите внимание на еще одну важную проблему, которую мне пришлось выяснить.Импортируйте объект AWS из Amplify, а не из SDK.Увидеть ниже.

Да, это противоречит текущим документам и учебникам.Если вы хотите получить дополнительную информацию о том, как это недавно изменилось, даже когда я работал над этим, см. Нижнюю часть этой проблемы Github .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);
    })
  }
...