[英]How to add an Authorization header to a HTTP request with file_get_contents()?
如標題所述,我在為OAuth 1.0a受保護的文件發出簽名的HTTP請求時遇到麻煩。 我試圖對要使用stream_context_create()方法添加授權標頭的請求使用file_get_contents方法。 [下面的源代碼]
$url = "https://rest.immobilienscout24.de/restapi/api/offer/v1.0/user/me/realestate";
$context = stream_context_create(array(
'http' => array(
'header' => "Authorization: OAuth
oauth_consumer_key = \"MY_KEY\”,
oauth_token = \"MY_TOKEN\"
oauth_signature_method= \"HMAC-SHA1\",
oauth_timestamp=\"TIMESTAMP\",
oauth_nonce=\"MY_NONCE\",
oauth_signature=\"MY_SIGNATURE\""
)
));
$data = file_get_contents($url, false, $context);
這是請求的外觀
GET /api/file HTTP/1.1 Host: example.com
Authorization: OAuth oauth_consumer_key="KEY",
oauth_token="TOKEN",
oauth_signature_method="HMAC-SHA1",
oauth_timestamp="TIMESTAMP",
oauth_nonce="NONCE",
oauth_signature="SIGNATURE"
問題:我總是收到以下錯誤:無法打開流:HTTP請求失敗! HTTP / 1.1 401第XX行未授權。 我究竟做錯了什么? 它在創建標題嗎? 我知道也可以使用curl來完成此操作,但是我實際上沒有任何知識,也沒有使用curl的經驗。
謝謝您的幫助!
OAuth協議參數通過以下方式在Authorization標頭中發送:
參數名稱和值按Parameter Encoding編碼 。
對於每個參數,名稱后均緊跟一個“ =”字符(ASCII代碼61),一個“”字符(ASCII代碼34),參數值(MAY為空)和另一個“”字符(ASCII代碼) 34)。
根據[ RFC2617 ],參數之間用逗號分隔(ASCII代碼44)和可選的線性空格。
根據[ RFC2617 ]第1.2節添加和解釋了可選領域參數。
一個問題是您要在標題字符串中插入\\n
( LF )字符,這是RFC2617所不允許的。 在oauth_token
之后,您似乎還缺少逗號。 還不清楚您是否正確編碼了參數。
我認為避免這些錯誤的一種更簡單的方法可能是使用類似http_build_query
並將PHP_QUERY_RFC3986
作為enc_type參數與RFC3986兼容 ,這是OAuth 1.0a所遵循的,或者您可以在單獨的array和array_map
自己編碼。
$params = [
"realm" => $realm, /* optional */
"oauth_consumer_key" => $key,
"oauth_token" => $token,
"oauth_signature_method" => $sigmeth,
"oauth_timestamp" => $timestamp,
"oauth_nonce" => $nonce,
"oauth_signature" => $sig,
];
/* This will give you the proper encoded string to include in your Authorization header */
$params = http_build_query($params, null, ',', PHP_QUERY_RFC3986);
$opts = ["http" => ["header" => "Authorization: OAuth " . $params]];
$context = stream_context_create($opts);
$data = file_get_contents($url, false, $context);
$params = implode(',',array_map(function($v,$k) {
return $k . '="' . rawurlencode($v) . '"';
}, $params, array_keys($params)));
$opts = ["http" => ["header" => "Authorization: OAuth " . $params]];
$context = stream_context_create($opts);
$data = file_get_contents($url, false, $context);
我認為選項2實際上更符合OAuth 1,因為http_build_query
不會引用參數。 rawurlencode
將符合RFC3986,這將有助於保持您的值正確編碼。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.