簡體   English   中英

如何使用file_get_contents()向HTTP請求添加授權標頭?

[英]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 1.0a規范

OAuth協議參數通過以下方式在Authorization標頭中發送:

  1. 參數名稱和值按Parameter Encoding編碼

  2. 對於每個參數,名稱后均緊跟一個“ =”字符(ASCII代碼61),一個“”字符(ASCII代碼34),參數值(MAY為空)和另一個“”字符(ASCII代碼) 34)。

  3. 根據[ RFC2617 ],參數之間用逗號分隔(ASCII代碼44)和可選的線性空格。

  4. 根據[ RFC2617 ]第1.2節添加和解釋了可選領域參數。

一個問題是您要在標題字符串中插入\\nLF )字符,這是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,
];

選項1

/* 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);

選項2

$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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM