Как аутентифицировать пользователя Cognito, используя только его подпрограмму Cognito и защищенный сервер с полными привилегиями AWS (защищенная межсерверная аутентификация между серверами) - PullRequest
2 голосов
/ 12 июня 2019

TL; DR: я хочу сделать запрос на проверку подлинности cognito к своему собственному бэкэнд-API с другого сервера.

У меня есть бэкэнд-API node.js (настроенный с помощью claudia-js и развернутый как AWS lambda)с интерфейсом шлюза API AWS и защищенным с помощью Cognito)

Мой интерфейс React может выполнять запросы к моему бэкэнду без проблем;Я просто использую реакцию Amplify, чтобы войти в систему в обычном потоке, получить токен, а затем сделать HTTPS-запросы к API-шлюзу.

У меня есть другой сервер (AWSasticbeanstalk, базовая аутентификация имени пользователя и пароля), на котором размещается микросервис, подключенный к системе планирования (повестка дня-js), к которой пользователи могут обращаться через внутренний API. Проблема: нам нужно иметь возможность общаться другим способом.

Задания сохраняются в БД с идентификатором пользователя (мы просто используем подпрограмму cognito в качестве нашего идентификатора пользователя, это делает вещи согласованными),Одна работа требует связи с внутренним API от имени нашего пользователя по расписанию (скажем, раз в месяц).Для этого требуется аутентификация пользователя cognito, учитывая только идентификатор пользователя cognito, получить токен и программно выполнить запрос REST / HTTP к бэкэнд-API.

Выполнено:

  • Добавил сервер обработчика заданий в качестве клиента приложения в мой пул пользователей Cognito

  • Записал обработчик заданий, который может проходить аутентификацию в пуле пользователей Cognito, используя мои собственные кредиты (жестко заданное имя пользователя / pwd)

  • Записать защищенный HTTP-запрос к API бэкэнда, используя токен из вышеприведенного шага

Код процессора задания:

// auth and cognito params  
const params = {
    AuthFlow: 'ADMIN_NO_SRP_AUTH',
    ClientId: 'xxxxxxxxxxxxxxxxxxxxxxx',
    UserPoolId: 'XX-XXXX-X_XXXXXXXXX',
    AuthParameters: {
      USERNAME: 'my-username',
      PASSWORD: 'my-pwd',
    },
  };

  cognitoidentityserviceprovider.adminInitiateAuth(params, (err, data) => {
    if (err) console.log(err);
    const token = data.AuthenticationResult.IdToken;

    // HTTP opts to call my backend api
    const options = {
      method: 'GET',
      url: 'https://my.api.url/tasks/action',
      headers: {
        Authorization: `Bearer ${token}`,
      },
      json: true,
    };

    // Call my backend api
    rp(options, (error, response, body) => {
      if (error) throw new Error(error);

      console.log(body);
    });
  });

Приведенный выше код работает отлично, я могу вызывать свой собственный API как пользователь (в данном случае я сам), но я хотел бы иметь возможность вызывать API с этим сценарием как любой пользователь ,предоставление API Cognito Auth с идентификатором пользователя Cognito и секретным ключом AWS, ролью IAM или чем-то, что необходимо в .env var или чем-то еще.Я просто не знаю, как этого добиться!ТИА

1 Ответ

0 голосов
/ 14 июня 2019

Для всех, кто читает: я отказался от этого подхода и вместо этого авторизовал клиентский сервер с использованием аутентификации IAM и клиента api gateway sdk.Информация о пользователе (не конфиденциальная) отправляется в теле http

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...