CloudFront отвечает кодом 413 после перенаправления AWS Cognito

У меня есть приложение React, созданное с использованием Serverless NextJS и работающее за AWS CloudFront. Я также использую AWS Cognito для аутентификации наших пользователей.

После успешной аутентификации пользователя через AWS Cognito он перенаправляется в мое приложение React со строкой запроса, содержащей токены OAuth (id_token, access_token, refresh_token, raw[id_token], raw[access_token], raw[refresh_token], raw[expires_in], raw[token_type]).

Кажется, что строка запроса просто превышает ограничения AWS CloudFront, и она выдает следующую ошибку ниже:

413 ERROR
The request could not be satisfied.

Bad request. We can't connect to the server for this app...

Generated by cloudfront (CloudFront)
Request ID: FlfDp8raw80pAFCvu3g7VEb_IRYbhHoHBkOEQxYyOTWMsNlRjTA7FQ==

С этой ошибкой уже сталкивались многие другие пользователи (см. пример). Интересно знать:

  • Есть ли обходные пути? Возможно, есть способ настроить AWS Cognito для уменьшения количества токенов, которые он передает в строке запроса по умолчанию?

  • Можно ли настроить AWS CloudFront так, чтобы он игнорировал ограничения по умолчанию на определенных страницах (а не в теме кэширования)?

  • Какое предложение продвигается? Единственное, что я могу себе представить, это не использовать AWS CloudFront.


person Hady    schedule 06.12.2020    source источник


Ответы (1)


Проанализировав поля запроса, которые AWS Cognito отправляет на URL-адрес обратного вызова, я смог определить, что не все поля необходимы для моего варианта использования. В частности, поля токена raw OAuth.

Имея эту информацию, я решил проблему, написав промежуточное программное обеспечение для перехвата моей серверной системы, перенаправляющей на мой внешний интерфейс (который находится за CloudFront), и обрезав поля строки запроса, которые мне не нужны для завершения аутентификации.

На случай, если это может вдохновить кого-то еще, кто столкнулся с похожей проблемой, вот как выглядит мое промежуточное ПО для моей серверной системы (Strapi):

module.exports = (strapi) => {
  return {
    initialize() {
      strapi.app.use(async (ctx, next) => {
        await next();

        if (ctx.request.url.startsWith("/connect/cognito/callback?code=")) {
          // Parse URL (with OAuth query string) Strapi is redirecting to
          const location = ctx.response.header.location;
          const { protocol, host, pathname, query } = url.parse(location);

          // Parse OAuth query string and remove redundant (and bloated) `raw` fields
          const queryObject = qs.parse(query);
          const trimmedQueryObject = _.omit(queryObject, "raw");

          // Reconstruct original redirect Url with shortened query string params
          const newLocation = `${protocol}//${host}${pathname}?${qs.stringify(
            trimmedQueryObject
          )}`;

          ctx.redirect(newLocation);
        }
      });
    },
  };
};

person Hady    schedule 07.12.2020