【发布时间】:2015-09-30 15:42:55
【问题描述】:
我需要创建一个具有以下结构的查询字符串: https://api.company.com/api/hello.json?app_id=$name&hash=$hash
$hash 变量应该是与我的客户端密码连接的当前挑战字符串的 SHA1。
我通过运行以下 bash 脚本在控制台中测试了我的 api 凭据(这给了我正确的响应)
$ challenge=$(curl -s "http://www.company.com/api/hello.json?app_id=$name" | head -1 | sed 's/.*"challenge": *"\([0-9]*\)".*/\1/')
$ hash=$(printf $challenge$key | openssl dgst -sha1 | sed 's/^.*\([a-f0-9]\{40\}\).*$/\1/')
$ curl "http://www.company.com/api/hello.json?app_id=$name&hash=$hash"
但是,当我尝试使用 PHP 以编程方式重新创建 $hash 变量时,由于哈希参数不正确,身份验证失败。
要创建我使用的 $hash 参数:
$hash = sha1($challenge . $key);
但显然我在这里遗漏了一些东西。我假设 bash 脚本中的表达式:
a-f0-9]\{40\}\).*$/\1/
检查字符串是否为 40 个字符的十六进制字符串,但我不确定如何将其集成到我的 PHP 代码中。
如果我在控制台中检查 $challenge 变量的值,我会得到 9 位数值,例如:244971205,而我的 PHP 脚本中的相同变量具有字符串值。这可能是我的 $hash 参数格式不正确的原因吗?
值得注意的是,如果我使用运行得到的 $hash 变量值
echo "$hash"
在控制台中直接在我的查询字符串中,api 调用成功,但我想以编程方式获得相同的值。
如果有人能指出正确的方向,将不胜感激。
【问题讨论】:
-
检查您的输入。您确定 PHP 的 $challenge 和 $key 与命令行中的相同吗?
var_export()可以帮忙。 -
我相信是这样,但会仔细检查。感谢您的提示!
-
如果我在控制台中检查 $challenge 的值,我会得到 9 位数值,例如:244971205,而我的 PHP 脚本中的相同变量具有字符串值。
-
在使用
printf | openssl dgst | sed方法时,我似乎得到了与使用sha1($challenge . $key)相同的结果,即使在使用整数和数字字符串的混合时也是如此。您确定$challenge和$key在两者之间是相同的吗? -
我注意到,如果在控制台中检查 $challenge 变量的值,我会得到一个 9 位数值,例如:244971205 而我的 PHP 脚本中的同一个变量有一个字符串值,所以看起来像我我在这里错过了一个重要的步骤。