Как настроить serverless.yml, шлюз API AWS или лямбда-обработчик AWS для чтения request.headers из запроса POST - PullRequest
0 голосов
/ 20 декабря 2018

Я пытался развернуть API, созданный с помощью flask и serverless framework, на лямбда-шлюз AWS и шлюз API, однако не смог прочитать правильный заголовок.

Я прочитал некоторое сообщение из https://stackoverflow.com/a/43830950/2806237,, в котором указано, что детали запроса будут доступны в event функции-обработчика.

Тем не менее, я использую wsgi.handler в качестве моего обработчика, так как я должен читать event переменную, которая существует в wsgi.hander?Должен ли я создать свой собственный обработчик или я могу откуда-нибудь получить детали запроса event?

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

Host: 10.0.0.48:9998
Connection: keep-alive
Content-Length: 37
Origin: xxxxxxxxxxxxxxxxxxxx
Authorization: AWS4-HMAC-SHA256 Credential=usernameHere/20181220///aws4_request, SignedHeaders=content-length;content-type;host;x-amz-content-sha256;x-amz-date;x-amz-target, Signature=c57780866a6380b92678e8a9d52d8220d3ecc836f4475b8334c553cf4dbb9ad4
Content-Type: application/json;charset=UTF-8
X-Amz-Content-Sha256: 615d42718684ea2b59442a6ce3dc6302404839b0875bca365a6e07e0d65f577c
Accept: application/json, text/javascript, */*; q=0.01
X-Amz-Target: SchoolLearnMeter_1980121.GetPassword
X-Amz-Date: 20181220T021132Z
User-Agent: Mozilla/5.0 (X11; CrOS x86_64 11210.0.0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3593.0 Safari/537.36
Accept-Encoding: gzip, deflate
Accept-Language: en-US,en;q=0.9.

Однако заголовок, который я получаю так:

Content-Length: 36
Content-Type: application/json
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: AU
Host: XXXXX.execute-api.ap-southeast-2.amazonaws.com
Postman-Token: 8742a77d-4e1a-4d0c-ba6a-6df15795e7c8
User-Agent: PostmanRuntime/7.4.0
Via: 1.1 098fddbcdf00e65b8479d1d17b41d28a.cloudfront.net (CloudFront)
X-Amz-Cf-Id: HafOPHJfXOungGylHkX4Y3klvdBR-kzoC-xz1aqNXo-4K2KbbsD_lg==
X-Amz-Date: 20181220T034409Z
X-Amzn-Trace-Id: Root=1-5c1b100a-7a69d8e08c9ee3e0e6b799e0
X-Forwarded-For: 115.187.209.206, 70.132.29.75
X-Forwarded-Port: 443
X-Forwarded-Proto: https 

Это application.py код

from flask import Flask, request, jsonify
import os, sys
import hashlib
import json
from dbConnection import DBConncetion
from awssigner import AWSSigner

application = Flask(__name__)
db_conn_str = os.environ["Chrome_DB"]
responseMessage = {"ResponseMessage":""}

@application.route("/u", methods=["POST"])
def getUserPasswordByUsername():
    try:
        serverSignature = AWSSigner(request).getSignature(json.dumps(request.get_json(Force=true)).replace(": ",":"))
        agentSignature = request.headers.get("Authorization").split("Signature=",1)[1]
        if(serverSignature == agentSignature):
            #Do something here
        else:
            raise Exception
    except:
        responseMessage["ResponseMessage"] = "There are some errors occured, please try again later"
        response = application.response_class(
            response= json.dumps(responseMessage),
            status=500,
            mimetype = "application/json"
        )
        return response

if __name__ == "__main__":
    application.run()
    #application.run("0.0.0.0", 9998, debug = True)

Это serverless.yml файл

service: testapiservices

plugins:
 - serverless-python-requirements
 - serverless-wsgi

custom:
 wsgi:
   app: application.application
   packRequirements: false
 pythonRequirements:
   dockerizePip: non-linux

provider:
 name: aws
 runtime: python3.7
 stage: dev
 region: ap-southeast-2

functions:
 app:
   handler: wsgi.handler
   environment:
     AppId: XXX
     Chrome_DB: XXX
   events:
     - http:
         cors: true
         method: post
         path: /
     - https: 'ANY{proxy+}'
   vpc:
     securityGroupIds:
       - XXX
     subnetIds:
       - XXX
       - XXX

1 Ответ

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

serverless-wsgi предоставляет вам обертку для фляги, поэтому он на самом деле обрабатывает переменную event в фоновом режиме и сопоставляет ее с Flask request.

Импортировать объект запроса фляги ииспользуйте это в своем коде вместо этого:

from flask import Flask, request

Прочитайте документы Flask вокруг request, но у него будут все заголовки и т. д., которые вы ожидаете в лямбде event

Также выиспользуют агент User-Agent: PostmanRuntime/7.4.0 для отправки запроса, который дает второй набор заголовков.Вы, буквально, как разработчик, устанавливаете эти заголовки, поэтому я запутался, почему вы ожидаете, что они будут совпадать, если вы не установите их в соответствие.

Какой заголовок вы специально хотите проверить?

...