我注意到当我发送这样的网址时:
http://localhost:3000/register/register_user/?sig=zaQ/876CwJMEEmrJqAOYHyEKBXy2s03NDmk+3FsXPr4=
当我使用控制器中的params [:sig]将其与预期结果进行比较时会发生什么:
zaQ/876CwJMEEmrJqAOYHyEKBXy2s03NDmk 3FsXPr4=
由于某种原因,字符串末尾第9个字符的url中的“+”符号已转换为空格。
不确定为什么会发生这种情况,是否只会出现+符号或什么。
Digest :: SHA256.base64digest(data)返回的结果有加号,因此我对签名的验证失败。
解决此问题的最佳方法是什么?在一般情况下,只是在比较之前将'+'符号转换为空格或者是一些不那么难看的解决方法是否足够?
答案 0 :(得分:1)
您需要对其进行网址编码。使用open-uri执行搜索并替换+和%2B或强制编码。
require 'cgi'
sig = "zaQ/876CwJMEEmrJqAOYHyEKBXy2s03NDmk+3FsXPr4="
puts CGI.escape(sig)
这次测试了。
irb(main):008:0> require 'cgi'
=> true
irb(main):009:0> CGI.escape('zaQ/876CwJMEEmrJqAOYHyEKBXy2s03NDmk+3FsXPr4=')
=> "zaQ%2F876CwJMEEmrJqAOYHyEKBXy2s03NDmk%2B3FsXPr4%3D"
irb(main):010:0>