【发布时间】:2021-04-22 05:54:36
【问题描述】:
我正在开发一个公共 API 的 Delphi REST 客户端,该 API 需要将 HMAC256/Base64 签名字符串添加到请求的标头以进行身份验证。我花了好几个小时试图弄清楚为什么它不起作用,所以我将来自我的 Delphi 客户端的原始请求与一个正常工作的 C# 库(使用 Wireshark)的请求进行了比较。
事实证明,我的请求与工作中的 C# 库生成的请求完全匹配,除了 Delphi 的 REST 客户端正在对添加到请求标头的值进行 URL 编码,因此使精心设计的签名无效。
这就是我将签名字符串添加到标题的方式:
RESTRequest1.Params.AddHeader('SIGNATURE', FSignature);
签名字符串可能包含斜线、加号和/或等号,而这些斜线、加号和/或等号不应该被 URL 编码。例如当签名字符串的值为...时
FSignature = '8A1BgACL9kB6P/kXuPdm99s05whfkrOUnEziEtU+0OY=';
...那么请求应该输出原始标头,例如...
GET /resource HTTP/1.1
User-Agent: Embarcadero URI Client/1.0
Connection: Keep-Alive
<snip>
SIGNATURE: 8A1BgACL9kB6P/kXuPdm99s05whfkrOUnEziEtU+0OY=
<snip>
...但是 Wireshark 将其显示为正在发送的实际值...
SIGNATURE: 8A1BgACL9kB6P%2FkXuPdm99s05whfkrOUnEziEtU%2B0OY%3D
有没有办法在使用 AddHeader 时防止值的 URL 编码?或者也许是另一种将原始标头添加到 TRESTClient 请求的方法?
PS:我已经尝试了 TRESTRequest.Params.AddHeader 和 TRESTClient.AddParameter 与 TRESTRequestParameterKind.pkHTTPHEADER 作为 Kind 参数。两者都产生了 URL 编码的值。
PS2:使用 Delphi RAD Studio 10.3。
【问题讨论】:
-
您是否尝试将参数的
Options属性设置为包含ptDoNotEncode? -
@R.Hoek 是的!这就是缺少的。我找不到将 poDoNotEncode 添加到 TRESTRequest.Params.AddHeader 的方法,但我能够将它作为第三个参数添加到 TRESTClient.AddParameter 中。如果您将其发布在下面,我很乐意将其标记为答案。谢谢!