AWS Cognito服务API? Amplify => Javascript SDK Angular app

问题描述 投票:2回答:1

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

这是如何运作的?我无法弄清楚如何将我在Amplify中收到的令牌转换为AWS.config或者他们应该去的地方。

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

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

这是我的MBP上的dev,但我正在将它与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);
    });
  }
amazon-web-services amazon-cognito aws-amplify
1个回答
3
投票

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

// 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对象,而不是SDK。见下文。

是的,这违背了当前的文档和教程。如果你想了解最近如何改变的背景知识,即使我正在研究它,请参阅此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);
    })
  }
© www.soinside.com 2019 - 2024. All rights reserved.