Я пытался развернуть 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