使用Python语言进行后端服务签名时,您需要先获取SDK,然后导入工程,最后参考校验后端签名示例校验签名是否一致。
本章节以IntelliJ IDEA 2018.3.5版本为例介绍。
弹出“New Project”对话框,选择“Python”,单击“Next”。
1 2 3 4 5 6 | app = Flask(__name__)
@app.route("/<id>", methods=['GET', 'POST', 'PUT', 'DELETE'])
@requires_apigateway_signature()
def hello(id):
return "Hello World!"
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | def requires_apigateway_signature():
def wrapper(f):
secrets = {
"signature_key1": "signature_secret1",
"signature_key2": "signature_secret2",
}
authorizationPattern = re.compile(
r'SDK-HMAC-SHA256\s+Access=([^,]+),\s?SignedHeaders=([^,]+),\s?Signature=(\w+)')
BasicDateFormat = "%Y%m%dT%H%M%SZ"
@wraps(f)
def wrapped(*args, **kwargs):
//签名校验代码
...
return f(*args, **kwargs)
return wrapped
return wrapper
|
1 2 3 4 5 6 7 8 | if "authorization" not in request.headers:
return 'Authorization not found.', 401
authorization = request.headers['authorization']
m = authorizationPattern.match(authorization)
if m is None:
return 'Authorization format incorrect.', 401
signingKey = m.group(1)
signedHeaders = m.group(2).split(";")
|
例如,Authorization头为:
1 | SDK-HMAC-SHA256 Access=signature_key1, SignedHeaders=host;x-sdk-date, Signature=e11adf65a20d1b82c25419b5********8d0ba12fed1ceb13ed00
|
则解析的结果为:
1 2 | signingKey=signature_key1
signedHeaders=host;x-sdk-date
|
1 2 3 | if signingKey not in secrets:
return 'Signing key not found.', 401
signingSecret = secrets[signingKey]
|
需要读取body的条件为:不存在值为UNSIGNED-PAYLOAD的x-sdk-content-sha256头。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | r = signer.HttpRequest()
r.method = request.method
r.uri = request.path
r.query = {}
for k in request.query_string.decode('utf-8').split('&'):
spl = k.split("=", 1)
if len(spl) < 2:
r.query[spl[0]] = ""
else:
r.query[spl[0]] = spl[1]
r.headers = {}
needbody = True
dateHeader = None
for k in signedHeaders:
if k not in request.headers:
return 'Signed header ' + k + ' not found', 401
v = request.headers[k]
if k.lower() == 'x-sdk-content-sha256' and v == 'UNSIGNED-PAYLOAD':
needbody = False
if k.lower() == 'x-sdk-date':
dateHeader = v
r.headers[k] = v
if needbody:
r.body = request.get_data()
|
1 2 3 4 5 | if dateHeader is None:
return 'Header x-sdk-date not found.', 401
t = datetime.strptime(dateHeader, BasicDateFormat)
if abs(t - datetime.utcnow()) > timedelta(minutes=15):
return 'Signature expired.', 401
|
1 2 3 4 5 | sig = signer.Signer()
sig.Key = signingKey
sig.Secret = signingSecret
if not sig.Verify(r, m.group(3)):
return 'Verify authroization failed.', 401
|
填入如图所示字段后,单击“Send request”,复制生成的curl命令,并在命令行中执行,服务器返回200。
如果使用错误的Key和Secret访问,服务器返回401认证不通过。
调用DeleteLaunchTemplateVersion删除指定实例启动模板的一个版本。不支持删除默...
日志服务支持客户端、网页、协议、SDK、API等多种日志采集方式,所有采集方式均...
本文转载自微信公众号「sowhat1412」,作者sowhat1412。转载本文请联系sowhat141...
买一个 域名 和空间多少钱?买一个域名和空间需要的费用,主要看买什么样的域名...
SAE应用引擎提供以下相关API接口。 命名空间和VPC API 描述 CreateNamespace 调...
功能说明 App 管理员可以通过该接口创建群组。 以下视频将帮助您快速了解如何通...
安全增强型Linux(SELinux)是一个Linux内核的功能,它提供支持访问控制的安全政...
1. 接口描述 接口请求域名: clb.tencentcloudapi.com 。 ModifyTargetWeight 接...
本文介绍安全组的使用操作,您可以通过ECS控制台或API使用安全组。 使用流程 您...
作为服务器管理者,做好服务器防护是非常重要的工作,服务器防护主要包括以下5个...