php - Twitter 401 未经授权——OAuth 请求 token

标签 php api http twitter oauth

我在 PHP 中使用 file_get_contents 向 Twitter API 发出 HTTP 请求。 尝试请求 token 时,出现错误:

Warning: file_get_contents(https://api.twitter.com/oauth/request_token): failed to open stream: HTTP request failed! HTTP/1.0 401 Unauthorized

这是我的代码

$appID = "MY-CONSUMER-ID";
$appSecret = "MY-CONSUMER-SECRET";

$url = "https://api.twitter.com/oauth/request_token";

$oauth = array(
    "oauth_nonce" => base64_encode(time()),        
    "oauth_callback" => "MY-URL",
    "oauth_signature_method" => "HMAC-SHA1",
    "oauth_timestamp" => time(),
    "oauth_consumer_key" => $appID,
    "oauth_version" => "1.0"
);

$token_string = "POST&" . rawurlencode($url) . "&" . rawurlencode(http_build_query($oauth));
$signing_key = rawurlencode($appSecret) . "&";
$signature = base64_encode(hash_hmac("sha1", $token_string, $signing_key, true));

$oauth["oauth_signature"] = $signature;

$header = array();
foreach ($oauth as $key => $value) { $header[] = rawurlencode($key) . "=\"" . rawurlencode($value) . "\""; }
$header = implode(", ", $header);
$header = "Authorization: OAuth " . $header;
echo $header;

$opts = array('http' => array(
    'method'  => "POST",
    'header'  => $header,
) );

$context  = stream_context_create($opts);
$result = file_get_contents($url, false, $context);

最佳答案

你真的帮助了我,我会帮助任何阅读这篇文章的人。

这不起作用的问题是因为 $oauth 数组必须按字母顺序排列(参见 https://dev.twitter.com/docs/auth/creating-signature )。因此,当它是 http_build_queried 时,它是错误的。

然而,这对我有帮助,因为我的签名传递了一个预期的 o_token,而我们此时没有(我使用此代码签署所有请求)所以 $signing_key = rawurlencode($appSecret) 。 "&"; 帮助解决了我的问题。

关于php - Twitter 401 未经授权——OAuth 请求 token ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20856762/

相关文章:

php - 如何转义动态 CSS 属性值

php - 在此上下文中,元素 p 不允许作为元素 dl 的子元素。 (抑制来自该子树的更多错误。)

api - 用于读取 "plus one"计数的 Google+ API

C:简单的HTTP服务器。读取本地文件并从浏览器下载

php - 如何在不使用 AND 的情况下从多行获取 ID

PHPExcel - colspan 主题名称

swift - 使用 Swift 3 对 Snowboy API 的 RESTful API 调用

python - 嵌入式 Python - 时间模块中的阻塞操作

http - 如何强制浏览器不下载内容处置为 :attachment header 的文件

python - Django 返回 http 早期刷新(分块响应)