2016-08-28 4 views
1

Как говорится в заголовке, у меня возникли проблемы с созданием подписанного HTTP-запроса для защищенного файла OAuth 1.0a. Я пытаюсь использовать метод file_get_contents для запроса, который хочет добавить заголовок авторизации, используя метод stream_context_create(). [Исходник ниже]Как добавить заголовок авторизации в HTTP-запрос с файлом_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. Что я делаю неправильно? Создает ли он заголовок? Я знаю, что это может быть сделано с завитом также, но у меня буквально нет знаний или опыта использования завитка.

Благодарим за помощь!

ответ

2

Согласно OAuth 1.0a spec

The OAuth Protocol Parameters are sent in the Authorization header the following way:

  1. Parameter names and values are encoded per Parameter Encoding .

  2. For each parameter, the name is immediately followed by an '=' character (ASCII code 61), a '"' character (ASCII code 34), the parameter value (MAY be empty), and another '"' character (ASCII code 34).

  3. Parameters are separated by a comma character (ASCII code 44) and OPTIONAL linear whitespace per [ RFC2617 ].

  4. The OPTIONAL realm parameter is added and interpreted per [ RFC2617 ], section 1.2.

Один вопрос в том, что вы вставляя \n (LF) символов в вашей строке заголовка, который не допускается в соответствии с RFC2617. Кажется, что вам не хватает запятой после вас oauth_token. Также неясно, правильно ли вы кодируете свои параметры.

Я думаю, что простой способ избежать этих ошибок может быть либо использовать что-то вроде http_build_query и передать PHP_QUERY_RFC3986 как enc_type paremeter, чтобы быть совместимым с RFC3986, что и OAuth 1.0a утверждает, что следует, или вы могли бы просто установите параметры в отдельном массиве и 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, который должен поддерживать правильное кодирование ваших значений.

+0

Спасибо! Я должен предоставить их в заголовке авторизации. По-прежнему такая же ошибка. Есть ли возможность увидеть запрос, отправленный моим xampp-сервером? Может быть, я мог бы найти ошибку тогда ... – Philipp

+0

Извините, я никогда не читал ранее спецификацию OAuth 1.0. Я не думал, что кто-то все еще использует OAuth1, но после краткого обзора я пересмотрел свой ответ, чтобы более точно ответить на ваши вопросы. Это характерно для OAuth1. Я просто ответил, как будто это был общий HTTP-вопрос. – Sherif

+0

Еще раз спасибо! Я тестировал оба варианта. все та же ошибка. Могла ли я получить ту же ошибку, если бы мои Ключи и подпись были бы неправильными? – Philipp

Смежные вопросы