【问题标题】:API Gateway sorting Query stringAPI Gateway 排序查询字符串
【发布时间】:2018-05-05 00:04:19
【问题描述】:

我目前正在尝试使用 API Gateway + Lambda 上的无服务器框架来实现 Express 应用程序。一切都按预期进行,直到我开始在我们这边引入请求签名。签名的工作方式是使用秘密令牌对包括查询字符串在内的完整 URL 进行签名。不幸的是,似乎 API Gateway 或 Cloudfront 正在按字母顺序重新排序查询字符串,这导致我们这边生成的校验和与客户端生成的校验和不同。

我们的 Express 服务器看到的内容:

https://example.com/endpoint?build_number=1&platform=ios

客户端发送的内容:

https://example.com/endpoint?platform=ios &build_number=1

如您所见,查询参数按字母顺序重新排序,这不是我所期望的。

有什么想法吗?

【问题讨论】:

    标签: node.js express aws-lambda aws-api-gateway serverless-framework


    【解决方案1】:

    我建议您的算法注定会给您带来问题,因为查询字符串是一组没有内在顺序的键/值对。

    不应期望它会以任何特定顺序通过任何特定系统。请求标头也是如此。一些构建 HTTP 请求的库将查询字符串参数存储在中间字典/哈希结构中,因此即使没有您在此处看到的问题(我怀疑是 API 网关,因为 CloudFront claims 保留了排序),这可以说是自?color=red&size=large 以来的次优设计(再次,可以说,但非常引人注目)完全?size=large&color=red 相同。

    我的猜测是 API Gateway 可能会通过规范化查询字符串排序来优化其执行缓存的能力(实际上并不使用 CloudFront 缓存——它有自己的实现)。

    但是,正如我在上面所建议的,您的算法应该要求对发送端的查询参数进行二进制、词法排序(区分大小写,而不是可能假定不区分大小写的“字母顺序”),然后再进行同样的处理在接收端。

    这似乎是不必要的复杂性,但这几乎肯定是各种 AWS 签名算法要求在签名之前对查询字符串(和标头,出于同样的原因)键和值进行排序的原因——因为您根本无法依赖客户端库、代理或其他实体以一致地处理它们。

    【讨论】:

    • 完美答案。
    • 我得到了答案的精神。我发现它们至少没有给你一个上下文属性,或者某种获取原始查询字符串的方法,这很烦人。就我而言,我正在编写一个模拟 api,它根据属性(包括查询字符串)对请求进行哈希处理。因此,我现在必须返回并重新散列所有内容以像 api 网关那样对查询字符串参数进行排序,或者计算每个排列以找到正确的散列。
    猜你喜欢
    • 2021-05-24
    • 2020-11-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-18
    • 2021-01-13
    相关资源
    最近更新 更多