AWS 的查询参数排序代码可以在他们的 Github 存储库中看到。
我想过为什么他们可能需要 API 客户端来签署请求:
- 中间代理可能会规范化 URL 并弄乱原始查询字符串的顺序
- URI RFC完全没有指定查询字符串参数的顺序,或者应该保留它
我最好的猜测是,由于 RFC,亚马逊认为他们会安全行事并要求双方签署 ORDERED 请求。
但是,我确实想要关于此的最终/官方消息。当然,实现者对这个要求有充分的理由。
AWS 的查询参数排序代码可以在他们的 Github 存储库中看到。
我想过为什么他们可能需要 API 客户端来签署请求:
我最好的猜测是,由于 RFC,亚马逊认为他们会安全行事并要求双方签署 ORDERED 请求。
但是,我确实想要关于此的最终/官方消息。当然,实现者对这个要求有充分的理由。
请求签名确保发送方和接收方可以就请求中发送的确切内容达成一致,并且没有中间方篡改它。
HTTP 请求的许多部分可以在不改变请求语义的情况下发生变化。例如,可以重新排序 HTTP 标头,正如您正确指出的查询参数一样。
因此,必须将请求规范化为消除这些歧义的格式,并且双方都将使用该格式来签署请求。否则,每一方都可以为同一请求生成不同的签名。对查询参数进行排序只是此过程的一部分。Amazon在 AWS V4 签名格式的文档中描述了他们的规范化过程和动机。