2016-08-28 11 views
1

タイトルでは、OAuth 1.0a保護されたファイルのHTTPリクエストの署名に問題があると書いています。 stream_context_create()メソッドを使用してAuthorizationヘッダーを追加する要求に対してfile_get_contentsメソッドを使用しようとしています。 [下のソースコード]file_get_contents()を使用してAuthorizationヘッダーをHTTPリクエストに追加するにはどうすればよいですか?

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

一つに記載の問題は、RFC2617に従って許可されていない、あなたのヘッダ文字列へ\nLF)文字を挿入していることです。 oauth_tokenの後にコンマがありません。パラメータを適切にエンコーディングしているかどうかは不明です。

私はこれらのミスを回避するための簡単な方法は、http_build_queryのようなものを使用してのOAuth 1.0aには、それが次のステート、またはあなたができるものであるRFC3986に準拠するようにenc_type paremeter、としてPHP_QUERY_RFC3986を渡すのいずれかになると思います個別の配列にパラメータを設定し、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); 

http_build_queryはパラメータを引用しませんので、私は、オプション2は、実際のOAuth 1とより従順だと思います。 rawurlencodeはRFC3986に準拠していますので、値を適切にエンコードするのに役立ちます。

+0

ありがとうございました!承認ヘッダーでそれらを提供する必要があります。 まだ同じエラーが発生しています。 私のxampp-serverが送信した要求を見る可能性はありますか?たぶん私はエラーを見つけることができた... – Philipp

+0

申し訳ありません、私は実際にOAuth 1.0の仕様を読むことはありません。誰もまだOAuth1を使用していないと思っていましたが、簡単な見直しの結果、あなたの質問にもっと適切に答えるための答えが改訂されました。これはOAuth1に固有です。あたかもこれが一般的なHTTPの質問であるかのように私はちょうど返事を出していた – Sherif

+0

もう一度ありがとう!私は両方のオプションをテストしました。まだ同じエラー。 キーと署名が間違っている場合、同じエラーが発生しますか? – Philipp

関連する問題