我们正在使用Commission Junction的REST服务,该服务要求我们在Authorization
标头中发送API密钥。
我们设置标题如下:
$ch = curl_init();
curl_setopt_array($ch, array(
// set url, timeouts, encoding headers etc.
CURLOPT_URL => 'https://....',
// ...
));
curl_setopt($ch, CURLOPT_HTTPHEADER, array(
'Authorization: ' . CJ_API_KEY,
'User-Agent: ' . OUR_USER_AGENT
));
$response = curl_exec($ch);
$info = curl_getinfo($ch);
问题是没有发送Authorization
标头(我们通过使用本地网址并执行var_export($_SERVER)
调试了这一点,显示User-Agent
标头已设置,但不是Authorization
标题。)
如果我们将标题名称更改为X-Authorization
,它会被发送 - 但这对我们没有帮助,因为该服务特别需要Authorization
标题。
我们如何让PHP + cURL发送任意Authorization
标题?
答案 0 :(得分:30)
PHP的Authorization
变量中不包含$_SERVER
标头。要正确调试请求,您应该使用apache_request_headers()
,这表示我们正在按照我们的要求发送Authorization
标头。
然后问题转移到确定要放在Authorization
标题中的内容,给出一些非常糟糕的文档。
答案 1 :(得分:4)
当客户端设置标头时,请求中的Authorization
- 标头包含在$_SERVER
中 - 不确定这是否是新的,但现在是。 HTTP标头在$_SERVER
数组中以HTTP_
为前缀,这可能是您之前忽略的内容。
此外,apache_request_headers()
是一个仅在您将Apache用作Web服务器时定义的函数。因此,所有拥有nginx等的人都被排除在外。
在服务器端:
<?php
// server.php
var_dump($_SERVER['HTTP_AUTHORIZATION']);
启动网络服务器(需要PHP 5.4):
$ php -S 0.0.0.0:31337 -t .
确保server.php在当前目录中。
使用cURL进行测试:
$ curl -H 'Authorization: FOO' http://0.0.0.0:31337/server.php
string(3) "FOO"
作品。 :)