Open numa3ch opened 9 years ago
@jsotopjp これはあくまでもサンプルのリクエストになります。アプリケーションID 4062f3c9c61d33e14dc3dab4cd63fa7e0c018757d85a0f776a1dc05c97f21b61 はありませんので、自分の作成したものに置き換える必要があります。それに伴ってシグネチャも変わります。
@jsotopjp PHPでの署名については
http://qiita.com/niftycloud_mb/items/dee4558558e86175ccea
を参考にしてみてください。後はHTTPのPOSTアクセスで、リクエストヘッダーに
などを追加してください。
ご解答ありがとうございます。
>PHPでの署名については >http://qiita.com/niftycloud_mb/items/dee4558558e86175ccea 教えていただいた上記URLを参考に、データストアにtestclassを作成し試したのですが シグネチャ生成でうまくいかないみたいです。
①PHPにてシグネチャ作成 <?php $method = 'GET'; $fqdn = 'mb.api.cloud.nifty.com'; $api_version = '2013-09-01'; $path = 'classes/testclass'; $hash = array(); ←*参考URLでは[]でうまくいかなかったため修正 $hash['where'] = json_encode(array("testKey" => "testValue")); $timestamp = "2013-12-02T02:44:35.452Z";
// 日付はこんな感じで // $timestamp = date(DATE_ISO8601, time());
$application_key = {myappkey}; $client_key = {myclientkey};
$header_string = "SignatureMethod=HmacSHA256&"; $header_string .= "SignatureVersion=2&"; $header_string .= "X-NCMB-Application-Key=".$application_key . "&"; $header_string .= "X-NCMB-Timestamp=".$timestamp . "&"; $header_string .= http_build_query($hash); ←(※1)
$signature_string = $method . "\n"; $signature_string .= $fqdn . "\n"; $signature_string .= "/" . $api_version . "/" . $path ."\n"; $signature_string .= $header_string;
echo base64_encode(hash_hmac("sha256", $signature_string, $client_key, true)); ←{myシグネチャ} echo "\n"; ?>
②①でシグネチャをコピーし、macターミナルにて、以下curlコード実行 curl -X GET -G -H "X-NCMB-Application-Key:{myappkey}" -H "X-NCMB-Timestamp:2013-12-02T02:44:35.452Z" -H "X-NCMB-Signature:{myシグネチャ}" -H "Content-Type: application/json" https://mb.api.cloud.nifty.com/2013-09-01/classes/testclass
過去スレッドにもあるようになりました {"code":"E403002","error":"Unauthorized operations for signature."} https://github.com/NIFTYCloud-mbaas/UserCommunity/issues/61 クエリ(※1)部分はPHP関数にて今回の場合は自動生成しているので大丈夫かと・・・
@jsotopjp
日付を 2013-12-02T02:44:35.452Z にされているようなので、上記のスクリプトで
http://mb.cloud.nifty.com/doc/rest/common/signature.html#署名用文字列を元にシグネチャを生成
と同じアプリケーションキー、クライアントキーで同じシグネチャが生成されるか確認してみてください。同じものが出ればシグネチャの生成処理は正しいということになります。
エラーメッセージはシグネチャが問題あるという内容ですが、タイムスタンプが2013年なので、その部分でエラーになっている可能性があります。まずはシグネチャの生成処理自体が正しく行えているか確認して貰えればと。
ご指摘ありがとうございます。
>日付を 2013-12-02T02:44:35.452Z にされているようなので、上記のスクリプトで >http://mb.cloud.nifty.com/doc/rest/common/signature.html#署名用文字列を元にシグネチャを生成 >と同じアプリケーションキー、クライアントキーで同じシグネチャが生成されるか確認してみてください。同じものが出ればシグネチャの生成処理は正しいということになります。
アプリケーションキー、クライアントキーを同じにして $path = 'classes/testclass';→$path = 'classes/TestClass';に調整したところ同じシグネチャが生成できました。
>タイムスタンプが2013年なので、その部分でエラーになっている可能性があります。 テスト用にtestclassクラスもTestClassクラスへ再作成し、アプリケーションキー、クライアントキーも自分のキーにして、タイムスタンプも"2015-05-06T12:56:13.745Z"へしたところできました。
以下、今後のために残しておきます。 ①macターミナルにて [リクエストサンプル] curl -X GET -G -H "X-NCMB-Application-Key:{myappkey}" -H "X-NCMB-Timestamp:2015-05-06T12:56:13.745Z" -H "X-NCMB-Signature: {mysignature}" -H "Content-Type: application/json" --data-urlencode 'where={"testKey":"testValue"}' https://mb.api.cloud.nifty.com/2013-09-01/classes/TestClass [レスポンスサンプル] {"results":[{"objectId":"DtbPAL8LV1xsagUF","createDate":"2015-05-06T12:40:13.094Z","updateDate":"2015-05-06T12:40:13.095Z","acl":{"*":{"read":true,"write":true}},"testKey":"testValue"}]}
②PHPにて <?php $method = 'GET'; $fqdn = 'mb.api.cloud.nifty.com'; $api_version = '2013-09-01'; $path = 'classes/TestClass'; $hash = array(); $hash['where'] = json_encode(array("testKey" => "testValue")); $timestamp = "2015-05-06T12:56:13.745Z"; // 本番はこちらでOK //$timestamp = date(DATE_ISO8601, time());
$application_key = {myappkey}; $client_key = {myclkey};
$header_string = "SignatureMethod=HmacSHA256&"; $header_string .= "SignatureVersion=2&"; $header_string .= "X-NCMB-Application-Key=".$application_key . "&"; $header_string .= "X-NCMB-Timestamp=".$timestamp . "&"; $header_string .= http_build_query($hash);
$signature_string = $method . "\n"; $signature_string .= $fqdn . "\n"; $signature_string .= "/" . $api_version . "/" . $path ."\n"; $signature_string .= $header_string; $signature = base64_encode(hash_hmac("sha256", $signature_string, $client_key, true));
$api_url = "https://" . $fqdn . "/" . $api_version . "/" . $path . "?" . http_build_query($hash);
$headers = array( 'X-NCMB-Application-Key:'.$application_key, 'X-NCMB-Timestamp:'.$timestamp, 'X-NCMB-Signature:'.$signature, 'Content-Type: application/json' );
$ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $api_url); curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);//当初いろいろうまくいかなかった手探りで追加 curl_setopt($ch, CURLOPT_FOLLOWLOCATION, TRUE);//↑と同じく無くてもうまくいく
$html = curl_exec($ch); $html = mb_convert_encoding($html,"UTF-8","EUC-JP"); var_dump($html); curl_close($ch); //終了 ?>
E404005:No such applicationが出る場合(初回質問時も?)は、$headersの設定(:コロンが抜けていた)が違っていた ^^;) その後($headers設定不備修正後)も、E403002:Unauthorized operations for signatureがでたが、 $api_urlのクエリ(?以降)を設定したらうまくいった
現在、REST APIリファレンスを元にRESTを勉強中です。
初歩的な質問ですが、 REST APIリファレンス「オブジェクト取得」 http://mb.cloud.nifty.com/doc/rest/datastore/objectGet.html にて、リクエストサンプル(以下コード①)を実行することで レスポンスサンプル(以下コード②)の結果が得られるということでしょうか。
macのターミナルから実行、レンタルサーバーからPHPにて試してみても E404005:No such applicationとなってしまいます。 RESTについては、まったくのど素人で手探り状態で勉強中です。 どなたかご教授いただけたらと思います。 よろしくお願いいたします。
①リクエストサンプル curl -X GET -G \ -H "X-NCMB-Application-Key:4062f3c9c61d33e14dc3dab4cd63fa7e0c018757d85a0f776a1dc05c97f21b61" \ -H "X-NCMB-Timestamp:2013-12-02T02:44:35.452Z" \ -H "X-NCMB-Signature: gK7k2aP6dgdUD3fsgn86czW0MsHweD7HRZinkOuYaFI=" \ -H "Content-Type: application/json" \ https://mb.api.cloud.nifty.com/2013-09-01/classes/TestClass/7FrmPTBKSNtVjajm
② {"objectId":"7FrmPTBKSNtVjajm","createDate":"2014-06-03T11:28:30.348Z","updateDate":"2014-06-03T11:28:30.348Z","acl":{"*":{"read":true,"write":true}},"testKey":"fugafuga"}