Почему root возвращает ошибку 403 в API Gateway - PullRequest
4 голосов
/ 12 июля 2019

У меня очень простая лямбда-функция, которая облегчает перенаправление коротких URL.Вот так ...

var env = process.env.NODE_ENV

exports.handler = async function (event) {
  var mappings = {
    "": "https://example.com",
    "/": "https://example.com",
    "/article1": "https://example.com/articles/article-title",
    "/podcasts": "https://example.com/podcasts"
  }
  return {
    body: null,
    headers: {
      "Location": mappings[event.path] || "https://example.com/four-oh-four"
    },
    isBase64Encoded: false,
    statusCode: 301
  }
}

URL перенаправляется очень хорошо для всех маршрутов, кроме домашней страницы (с косой чертой или без нее).Вместо домашней страницы я получаю сообщение об ошибке «Missing Authentication Token» от API Gateway (или, скорее, Cloudfront).

Керлинг не показывает ничего ... (Обновлен код скручивания, мой плохой, я оставил перенаправление).

$ curl -v https://short.url/
*   Trying xxx.xx.xxx.xx...
* TCP_NODELAY set
* Connected to short.url (xxx.xx.xxx.xx) port 443 (#0)
* ALPN, offering h2
* ALPN, offering http/1.1
* successfully set certificate verify locations:
*   CAfile: /path/to/ca-certificates.crt
  CApath: /path/to/certs
* (304) (OUT), TLS handshake, Client hello (1):
* (304) (IN), TLS handshake, Server hello (2):
* TLSv1.2 (IN), TLS handshake, Certificate (11):
* TLSv1.2 (IN), TLS handshake, Server key exchange (12):
* TLSv1.2 (IN), TLS handshake, Server finished (14):
* TLSv1.2 (OUT), TLS handshake, Client key exchange (16):
* TLSv1.2 (OUT), TLS change cipher, Client hello (1):
* TLSv1.2 (OUT), TLS handshake, Finished (20):
* TLSv1.2 (IN), TLS handshake, Finished (20):
* SSL connection using TLSv1.2 / xxxxxxxxxxxx-SHA256
* ALPN, server accepted to use h2
* Server certificate:
*  subject: CN=*.ib.run
*  start date: Apr  5 00:00:00 2019 GMT
*  expire date: May  5 12:00:00 2020 GMT
*  subjectAltName: host "short.url" matched cert's "short.url"
*  issuer: xxx; O=xxx; OU=xxx; CN=xxx
*  SSL certificate verify ok.
* Using HTTP2, server supports multi-use
* Connection state changed (HTTP/2 confirmed)
* Copying HTTP/2 data in stream buffer to connection buffer after upgrade: len=0
* Using Stream ID: 1 (easy handle xxxxxxxx)
> GET / HTTP/2
> Host: short.url
> User-Agent: curl/7.58.0
> Accept: */*
> 
* Connection state changed (MAX_CONCURRENT_STREAMS updated)!
< HTTP/2 403 
< content-type: application/json
< content-length: 42
< date: Sat, 20 Jul 2019 03:51:44 GMT
< x-amzn-requestid: xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx
< x-amzn-errortype: MissingAuthenticationTokenException
< x-amz-apigw-id: xxxxxxxxxxxxxx_
< x-cache: Error from cloudfront
< via: 1.1 xxxxxxxxxxxxxxxxxxxxxx.cloudfront.net (CloudFront)
< x-amz-cf-pop: xxxxx-xx
< x-amz-cf-id: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx===
< 
* Connection #0 to host short.url left intact
{"message":"Missing Authentication Token"}

1 Ответ

3 голосов
/ 22 июля 2019

Ответ «Отсутствует токен аутентификации» вводит в заблуждение. Это говорит о том, что вам нужно предоставить токен. Настоящая ошибка в том, что ваши маршруты в шлюзе Api не настроены должным образом. Таким образом, это в основном Маршрут не найден от API-шлюза.

Вам необходимо предоставить Маршрут для "/" с методом или методом any и перенаправить его в функцию Lambda. Вы, вероятно, настроили подчиненный маршрут, но не указали маршрут для "/"

Route on /

В данный момент curl достигает URL-адреса "/" с помощью метода GET, и Api-Gateway не знает, как маршрутизировать этот вызов, поэтому отвечает: «Отсутствует токен аутентификации» .

Вы можете воспроизвести это поведение на каждом несуществующем маршруте. Попробуйте: / sdfsdfsdf например. Вы получите ту же ошибку.

Настройте маршрут, и все будет хорошо.

Надеюсь, я смогу вам помочь!

Dominik

...