Как сделать запрос Get в API Gateway с помощью Angular? - PullRequest
5 голосов
/ 15 марта 2019

Я пытаюсь достичь этой конечной точки AWS :

https://abcde12345hf.execute-api.us-east-2.amazonaws.com/dev/users

, которая возвращает:

[{
  "id": 1,
  "name": "Mike"
},{
  "id": 2,
  "name": "Brian"
}]
  • В моем коде Angular яиспользуя AWS4 библиотеку для отправки secretAccessKey , accessKeyId и sessionToken для аутентификации пользователя, но я получаю следующееошибка:

core.js: 12501 ОШИБКА: ошибка: не выполнена (в обещании): ошибка: запрос не выполнен с кодом состояния 403 Ошибка: запрос не выполнен с кодом состояния 403

  • Кто-нибудь знает, как правильно использовать AWS4 с Angular, чтобы я мог сделать этот простой вызов GET?или кто-нибудь знает другой способ сделать этот вызов, используя эти ключи и токен для аутентификации?Заранее большое спасибо!

Так я получаю ключи и токен (эта часть прекрасно работает)

AWS.config.region = 'us-east-2';
AWS.config.credentials = new AWS.CognitoIdentityCredentials({
    IdentityPoolId: 'us-east-2:ehkjthf-sf23-12ds-xxxxxxxxx',
    Logins: {
        'cognito-idp.us-east-2.amazonaws.com/us-east-2_Raxxxx': this.id_token
    }
});

console.log(AWS.config.credentials);

Теперь вот как я использую эти ключи и токен для вызова GET.

(AWS.config.credentials as AWS.Credentials).get(function(error: AWSError){
  if(error){
    console.log('Error ', error);
  }else{
  let request = {
    host: 'https://abcde12345hf.execute-api.us-east-2.amazonaws.com/dev/users',
    method: 'GET',
    url:  'https://abcde12345hf.execute-api.us-east-2.amazonaws.com/dev/users',
    path: '/users',
    headers: {
      "Content-Type":"application/json"
    },
  }

  let signedRequest = aws4.sign(request,
    {
      secretAccessKey: AWS.config.credentials.secretAccessKey,
      accessKeyId: AWS.config.credentials.accessKeyId,
      sessionToken: AWS.config.credentials.sessionToken
    });

    delete signedRequest.headers['Host']
    delete signedRequest.headers['Content-Length']

    axios(signedRequest).then((response) =>{
      console.log(response); // Output the Array Object here
    });
  }
});

1 Ответ

4 голосов
/ 21 марта 2019

У меня получилось, и я поделюсь своим решением, если кому-то еще понадобится!

Я закончил тем, что использовал http сервис от angular, а не axios. Вот мое решение;

(AWS.config.credentials as AWS.Credentials).get((error: AWSError) =>{
 if(error){
   console.log('Error ', error);
 }else{
 let request = {
   host: 'abcdefg.execute-api.us-east-2.amazonaws.com',
   method: 'GET',
   url:  `https://abcdefg.execute-api.us-east-2.amazonaws.com/dev/users`,
   path: '/dev/users'
 }

  let signedRequest = aws4.sign(request, {
    secretAccessKey: AWS.config.credentials.secretAccessKey,
    accessKeyId: AWS.config.credentials.accessKeyId,
    sessionToken: AWS.config.credentials.sessionToken
  });
  delete signedRequest.headers['Host'];
  this.http.get(signedRequest.url, signedRequest).subscribe(res => this.myObject = res);
 }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...