2016-08-22 7 views
0

私はJiveのAPIからデータを取得するためのコードをいくつか持っています。私はMAMPでこのコードを実行しています。これにより、PHP 5.6.10またはPHP 7.0.0のいずれかを実行できます。 PHP5では、私は成功した応答を得る。 PHP 7では、401 Unauthorizedを取得します。fopen no PHP 7での承認ヘッダ

関連の機能はここにある:

protected function sendRequest($method, $url, $auth = null) { 
    global $CFG; 
    $options = func_num_args() === 4 ? func_get_arg(3) : array(); 

    $http = array(
     'max_redirects' => 0, 
     'request_fulluri' => 1, 
     'ignore_errors' => true, 
     'method' => $method, 
     'header' => array() 
    ); 

    if (!is_null($auth)) { 
     array_push($http['header'], 'Authorization: ' . $auth); 
    } 

    if (($method === 'PUT' || $method === 'POST') && isset($options['content'])) { 
     $http['content'] = $options['content']; 
     array_push($http['header'], 'Content-length: ' . strlen($options['content'])); 
     array_push($http['header'], 'Content-Type: application/json'); 
    } 

    var_dump($http);echo('<hr/>'); 

    $context = stream_context_create(array('http' => $http)); 

    var_dump(stream_context_get_options($context));echo('<hr/>'); 
    $fp = fopen($url, 'rb', false, $context); 
    if (! $fp) { 
     throw new \Exception('Request failed: $php_errormsg'); 
    } 
    $metadata = stream_get_meta_data($fp); 
    $content = stream_get_contents($fp); 
    $responseCode = (int)explode(' ', $metadata['wrapper_data'][0])[1]; 

    fclose($fp); 

    return array (
     'metadata' => $metadata, 
     'content' => $content, 
     'status' => $responseCode 
    ); 
} 

のvar_dumpコールは両方のPHPのバージョンと同じ結果を生成します。私が得る応答は次のとおりです。

{ 
    "metadata": { 
     "wrapper_data": [ 
      "HTTP/1.0 401 Unauthorized", 
      "Server: Apache", 
      "X-Jive-Request-Id: 6c433c20-688a-11e6-b332-005056a4250c", 
      "X-Jive-Flow-Id: 6c433c21-688a-11e6-b332-005056a4250c", 
      "X-Frame-Options: SAMEORIGIN", 
      "Expires: Mon, 22 Aug 2016 17:04:01 GMT", 
      "Cache-Control: no-store, no-cache, must-revalidate, private, max-age=0", 
      "X-JSL: D=1754 t=1471885441249342", 
      "Content-Type: text/plain", 
      "Date: Mon, 22 Aug 2016 17:04:01 GMT", 
      "Connection: close", 
      "Set-Cookie: jive.login.ts=1471885441250; Path=/; Secure; HttpOnly;HttpOnly", 
      "Set-Cookie: X-JCAPI-Token=pTVEn2P4; Path=/; Secure; HttpOnly", 
      "Set-Cookie: BIGipServerpool_sandbox.jiveon.com=25472522.20480.0000; path=/" 
     ], 
     "wrapper_type": "http", 
     "stream_type": "tcp_socket/ssl", 
     "mode": "rb", 
     "unread_bytes": 0, 
     "seekable": false, 
     "uri": "https://sandbox.jiveon.com/api/core/v3/activities?after=2016-08-22T17:01:14%2b0000&count=500", 
     "crypto": { 
      "protocol": "TLSv1", 
      "cipher_name": "ECDHE-RSA-AES256-SHA", 
      "cipher_bits": 256, 
      "cipher_version": "TLSv1/SSLv3" 
     }, 
     "timed_out": false, 
     "blocked": true, 
     "eof": false 
    }, 
    "content": "", 
    "status": 401, 
    "success": false 
} 

https://requestb.inを使用することにより、私はPHP7のバージョンは、これを引き起こすためにPHP 5.6.10とPHP 7の間で変更内容Authorizationヘッダー

が含まれていないことを見ることができますか?どうすれば修正できますか?

EDIT:赤ん坊のテキストを削除し、リクエストビンの結果を追加します。

+0

私はWWW-Authenticate:Basic realm = \ "Jive SBS \" "をPHP5リクエストで見ていますが、PHP7では表示しません。私はこのAPIを使ったことがないので、おそらくあなたはそれらと連絡を取る必要があります。 PHP7は、APIがハッキングしようと考えている別のヘッダーを送信している可能性がありますか? – MonkeyZeus

+0

ありがとうございます。それは私にアイデアを与えます。私は、エンドポイントで制御を要求し、何が違うのかを見てみましょう。 –

+0

NPの場合は、単にJSON APIとやりとりしているようで、URLを扱うときにfopen()がCURLのラッパーにすぎないため、fopen()ではなくCURLを使用することを検討してください。私はfopen()を使うことに何か利点があるのではないかと疑いますが、私は専門家ではありませんので、幸運です! – MonkeyZeus

答えて

0

次作品:私は今、配列変数内のすべてのヘッダを格納し、それにヘッダープロパティを設定してい

protected function sendRequest($method, $url, $auth = null) { 
    global $CFG; 
    $options = func_num_args() === 4 ? func_get_arg(3) : array(); 

    $http = array(
     'max_redirects' => 0, 
     'request_fulluri' => 1, 
     'ignore_errors' => true, 
     'method' => $method 
    ); 

    $headers = array(); 

    if (!is_null($auth)) { 
     array_push($headers, 'Authorization: ' . $auth); 
    } 

    if (($method === 'PUT' || $method === 'POST') && isset($options['content'])) { 
     $http['content'] = $options['content']; 
     array_push($headers, 'Content-length: ' . strlen($options['content'])); 
     array_push($headers, 'Content-Type: application/json'); 
    } 

    $http['header'] = $headers; 

    $context = stream_context_create(array('http' => $http)); 

    var_dump(stream_context_get_options($context));echo('<hr/>'); 
    $fp = fopen($url, 'rb', false, $context); 
    if (! $fp) { 
     throw new \Exception('Request failed: $php_errormsg'); 
    } 
    $metadata = stream_get_meta_data($fp); 
    $content = stream_get_contents($fp); 
    $responseCode = (int)explode(' ', $metadata['wrapper_data'][0])[1]; 

    fclose($fp); 

    return array (
     'metadata' => $metadata, 
     'content' => $content, 
     'status' => $responseCode 
    ); 
    } 

私は100%確信しているわけではありませんが、私はそれが変数参照と関係があると思います。コードの1回の反復で、$ http認可プロパティーにはvar_dumpによるアンパサンドがマークされていて、それはfopenによって無視されていました。そのアンパサンドを削除した別の反復が機能しました。

+0

も参照してくださいhttps://github.com/RusticiSoftware/TinCanPHP/pull/72#issuecomment-241751758 –

関連する問題