使用PHP和curl设置Authorization标头

时间:2009-08-20 09:18:40

标签: php rest curl

我们正在使用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标题?

2 个答案:

答案 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"

作品。 :)