NIFCLOUD-mbaas / UserCommunity

ニフクラ mobile backend ユーザーコミュニティ
https://mbaas.nifcloud.com/
82 stars 18 forks source link

PHPでREST_APIのGET以外ができない #234

Open nyama-key opened 9 years ago

nyama-key commented 9 years ago

PHPでRESTのオブジェクトの取得は出来たのですが、 GET以外のメソッドだと

string(67) "{"code":"E403002","error":"Unauthorized operations for signature."}"

と返ってきてエラーになってしまいます。

どこかおかしいところがありましたらご教示ください。

/** テスト確認用 **/
// データ登録
$a = new NB();
$class = "UserData8";
$query = array("name" => "Taro");
$r = $a->post_NBdata($class, $query);
var_dump($r);

// データ更新
$a = new NB();
$objectId = "NrypFLPN7jWUsqYG";
$class = "UserData8/" .$objectId;
$query = array("name" => "Jiro");
$r = $a->put_NBdata($class, $query);
var_dump($r);

// データ取得
$a = new NB();
$class = "UserData8";
$query = array(
  "name" => array(
    '$ne' => "Hanako"
   )
);
$r = $a->get_NBdata($class, $query);
<?php

class NB {
 public $application_key;
 public $client_key;
 public $timestamp;

function __construct(){
  $this->application_key = 'アプリケーションKEY';
  $this->client_key      = 'クライアントKEY';
  $this->timestamp       = "2015-09-02T01:44:35.452Z";
}
function _get_signature($method, $class, $hash_query){

$fqdn   = 'mb.api.cloud.nifty.com';
$api_version = '2013-09-01';
$path        = 'classes/' .$class;

$header_string  = "SignatureMethod=HmacSHA256&";
$header_string .= "SignatureVersion=2&";
$header_string .= "X-NCMB-Application-Key=".$this->application_key . "&";
$header_string .= "X-NCMB-Timestamp=".$this->timestamp . "&";
$header_string .= $hash_query;

$signature_string  = $method . "\n";
$signature_string .= $fqdn . "\n";
$signature_string .= "/" . $api_version . "/" . $path ."\n";
$signature_string .= $header_string;
var_dump($signature_string);

$signature =  base64_encode(hash_hmac("sha256", $signature_string, $this->client_key, true));

return $signature;
}

function get_NBdata($class, $query){

    $method = 'GET';
    $hash['where'] = json_encode($query, JSON_NUMERIC_CHECK);
    $hash_query = http_build_query($hash);
    $signature = $this->_get_signature($method,$class,$hash_query);

    $cmd = 'curl -X GET -G \
     -H "X-NCMB-Application-Key:' .$this->application_key .'"\
     -H "X-NCMB-Timestamp:' .$this->timestamp .'"\
     -H "X-NCMB-Signature:' .$signature .'"\
     -H "Content-Type: application/json"\
     --data-urlencode \'where=' .$hash['where'] .'\'\
     https://mb.api.cloud.nifty.com/2013-09-01/classes/' .$class;

    var_dump($cmd);
    $r = exec($cmd);
    $r_ar = json_decode($r, 5);
    return $r_ar['results'];

} // end function

function post_NBdata($class, $query){

    $method = 'POST';
    $hash = json_encode($query, JSON_NUMERIC_CHECK);
    $hash_query = urlencode($hash);
    $signature = $this->_get_signature($method,$class,$hash_query);

    $cmd = 'curl -X POST -G \
     -H "X-NCMB-Application-Key:' .$this->application_key .'"\
     -H "X-NCMB-Timestamp:' .$this->timestamp .'"\
     -H "X-NCMB-Signature:' .$signature .'"\
     -H "Content-Type: application/json"\
     -d \'' .$hash .'\'\
     https://mb.api.cloud.nifty.com/2013-09-01/classes/' .$class;

    var_dump($cmd);
    $r = exec($cmd);
    return $r;

} // end function

function put_NBdata($class, $query){

$method = 'PUT';
$hash = json_encode($query, JSON_NUMERIC_CHECK);
$hash_query = urlencode($hash);
$signature = $this->_get_signature($method,$class,$hash_query);

$cmd = 'curl -X PUT \
 -H "X-NCMB-Application-Key:' .$this->application_key .'"\
 -H "X-NCMB-Timestamp:' .$this->timestamp .'"\
 -H "X-NCMB-Signature:' .$signature .'"\
 -H "Content-Type: application/json"\
 -d \'' .$hash .'\'\
 https://mb.api.cloud.nifty.com/2013-09-01/classes/' .$class;

var_dump($cmd);
$r = exec($cmd);
return $r;

} // end function

} // end class
ncmbsupport commented 9 years ago

ご質問いただき、ありがとうございました。 以下のように回答いたします。

REST APIを利用し、GET以外のリクエストを送信する時、 作成したシグネチャに不正があったエラーとなっております。

実装コードを拝見させていただき、post_NBdata($class, $query)には 以下のように$hash_queryを渡しましたが、POSTの場合、 $hash_query(POSTデータ)はシグネチャー生成には使いませんので、 渡す必要がありません。

$this->_get_signature($method,$class,$hash_query);

詳細は以下のドキュメントをご参考ください。

http://mb.cloud.nifty.com/doc/current/rest/common/signature.html

なお、弊社のハンズオンで提供しているWordpressプラグインサンプルコード(PHP)がありますので、ぜひご参考にしていただければと思います。

https://github.com/ndyuya/ncmb-post-notification