Как правильно получить исходный заголовок в развернутой лямбда-серверах, развернутых через шлюз API? - PullRequest
0 голосов
/ 05 декабря 2018

Я использую безсерверный фреймворк для развертывания простой лямбды (записанной в узле / экспрессе) позади шлюза API ...

В GET я вижу заголовок origin, но вPOST Я не могу - это не передается в мою лямбда-функцию!

Кто-нибудь знает, почему нет и как заставить ее пройти?

Фон:

Я заметил, что в POST источник добавляется в строку запроса в журналах:

originalUrl: '/dev/endpoint?Origin=MY%20ORIGIN%20HERE',

Итак, я могу извлечь источник из значений строки запроса, но я хочузнаете, является ли это правильным способом сделать что-либо на бессерверной платформе, или я должен установить что-то, чтобы позволить API-шлюзу отправлять источник через POST, как это делает GET?Почему эти 2 глагола ведут себя по-разному?

Мой код / ​​конфигурация:

определение функции в serverless.yml выглядит так:

myGetFunction:
  handler: lambda/index.handler
  events:
    - http:
        path: /endpoint
        method: get
        cors: true
myPostFunction:
  handler: lambda/index.handler
  events:
    - http:
        path: /endpoint
        method: post
        cors: true

Если я просто добавлю в свой index.handler следующее:

app.use((req, res) => {
  console.log('LOG REQUEST', req)
  res.send('interesting')
})

В моей функции обработчика я хочу получить только отправленный заголовок запроса источника.В GET это просто: журналы cloudwatch показывают, что это доступно в GET-запросе в объекте заголовков:

headers: 
  {
    accept: '*/*',
    'accept-encoding': 'gzip, deflate',
    'cache-control': 'no-cache',
    'cloudfront-forwarded-proto': 'https',
    'cloudfront-is-desktop-viewer': 'true',
    'cloudfront-is-mobile-viewer': 'false',
    'cloudfront-is-smarttv-viewer': 'false',
    'cloudfront-is-tablet-viewer': 'false',
    'cloudfront-viewer-country': 'GB',
    host: 'X.execute-api.us-east-1.amazonaws.com',
    origin: 'MY ORIGIN HERE',

НО: в POST есть все остальные заголовки, но origin пусто.

1 Ответ

0 голосов
/ 06 декабря 2018

Я немного покопался в этом и натолкнулся на пару реализаций.

По умолчанию кажется, что заголовок "origin" не передается в событиях шлюза API.(Я создал новый безсерверный проект и просто повторил, что именно было событием шлюза API.) Так что это из какого-то другого источника.Я подумал, что это может быть пользовательский домен, и проверил это.Никаких кубиков.

Мое единственное предположение, что у вас есть это за каким-то другим слоем (CloudFront?), Который перенаправляет эти заголовки для вас.Если это так, то я бы посоветовал вам посмотреть и посмотреть, сможете ли вы переслать эти заголовки для запроса POST, как это делается для запроса GET.

Моя единственная другая заключительная мысльесли ничего из вышеперечисленного не является правдой, значит, что в некотором промежуточном программном обеспечении происходит какое-то волшебство.Я сомневаюсь, что это так.

Для справки: это были мои полные serverless.yml и handler.js, которые я проверял, а также полный неизмененный объект события, полученный в конечной точке.

service: so-test

provider:
name: aws
runtime: nodejs8.10

functions:
myGetFunction:
    handler: handler.hello
    events:
    - http:
        path: /endpoint
        method: get
        cors: true
myPostFunction:
    handler: handler.hello
    events:
    - http:
        path: /endpoint
        method: post
        cors: true

И код nodejs:

'use strict';

module.exports.hello = async (event, context) => {
return {
    statusCode: 200,
    body: JSON.stringify({
    message: 'Go Serverless v1.0! Your function executed successfully!',
    input: event,
    }),
};
};

Наконец, объект ответа

{
    "message": "Go Serverless v1.0! Your function executed successfully!",
    "input": {
        "resource": "/endpoint",
        "path": "/test/endpoint",
        "httpMethod": "GET",
        "headers": {
            "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8",
            "Accept-Encoding": "gzip, deflate, br",
            "Accept-Language": "en-US,en;q=0.9",
            "CloudFront-Forwarded-Proto": "https",
            "CloudFront-Is-Desktop-Viewer": "true",
            "CloudFront-Is-Mobile-Viewer": "false",
            "CloudFront-Is-SmartTV-Viewer": "false",
            "CloudFront-Is-Tablet-Viewer": "false",
            "CloudFront-Viewer-Country": "US",
            "Host": "so-test.serverless-examples.com",
            "upgrade-insecure-requests": "1",
            "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.110 Safari/537.36",
            "Via": "2.0 f92491812e422470607f365e923929b5.cloudfront.net (CloudFront)",
            "X-Amz-Cf-Id": "6AwZPV3uCYxseJIAmsGzhApzRostCiLXwwM3XsbSJP4K8hQx11MSgw==",
            "X-Amzn-Trace-Id": "Root=1-5c086dd9-bce03ab0c216116fa6de9786",
            "X-Forwarded-For": "55.55.55.555, 70.132.32.155",
            "X-Forwarded-Port": "443",
            "X-Forwarded-Proto": "https"
        },
        "multiValueHeaders": {
            "Accept": [
                "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8"
            ],
            "Accept-Encoding": [
                "gzip, deflate, br"
            ],
            "Accept-Language": [
                "en-US,en;q=0.9"
            ],
            "CloudFront-Forwarded-Proto": [
                "https"
            ],
            "CloudFront-Is-Desktop-Viewer": [
                "true"
            ],
            "CloudFront-Is-Mobile-Viewer": [
                "false"
            ],
            "CloudFront-Is-SmartTV-Viewer": [
                "false"
            ],
            "CloudFront-Is-Tablet-Viewer": [
                "false"
            ],
            "CloudFront-Viewer-Country": [
                "US"
            ],
            "Host": [
                "so-test.serverless-examples.com"
            ],
            "upgrade-insecure-requests": [
                "1"
            ],
            "User-Agent": [
                "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.110 Safari/537.36"
            ],
            "Via": [
                "2.0 f92491812e422470607f365e923929b5.cloudfront.net (CloudFront)"
            ],
            "X-Amz-Cf-Id": [
                "6AwZPV3uCYxseJIAmsGzhApzRostCiLXwwM3XsbSJP4K8hQx11MSgw=="
            ],
            "X-Amzn-Trace-Id": [
                "Root=1-5c086dd9-bce03ab0c216116fa6de9786"
            ],
            "X-Forwarded-For": [
                "55.55.55.555, 70.132.32.155"
            ],
            "X-Forwarded-Port": [
                "443"
            ],
            "X-Forwarded-Proto": [
                "https"
            ]
        },
        "queryStringParameters": null,
        "multiValueQueryStringParameters": null,
        "pathParameters": null,
        "stageVariables": null,
        "requestContext": {
            "resourceId": "mftg6x",
            "resourcePath": "/endpoint",
            "httpMethod": "GET",
            "extendedRequestId": "RdYZ7HaxoAMFQYQ=",
            "requestTime": "06/Dec/2018:00:31:21 +0000",
            "path": "/test/endpoint",
            "accountId": "800708648372",
            "protocol": "HTTP/1.1",
            "stage": "dev",
            "domainPrefix": "so-test",
            "requestTimeEpoch": 1544056281163,
            "requestId": "410632a3-f8ee-11e8-a7e2-7d886f93a0e4",
            "identity": {
                "cognitoIdentityPoolId": null,
                "accountId": null,
                "cognitoIdentityId": null,
                "caller": null,
                "sourceIp": "55.55.55.555",
                "accessKey": null,
                "cognitoAuthenticationType": null,
                "cognitoAuthenticationProvider": null,
                "userArn": null,
                "userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.110 Safari/537.36",
                "user": null
            },
            "domainName": "so-test.serverless-examples.com",
            "apiId": "txctij0cnp"
        },
        "body": null,
        "isBase64Encoded": false
    }
}
...