node.jsでNCMB(nifty cloud mobile backend)のシグネチャ作成
Created: 3/18/2014, 12:00:00 AM
最近、NCMB(Nifty cloud mobile backend)触ってますが、なぜかnode.jsで利用しないといけなくなり署名認証でごにょごにょした成果をGISTにあげときました。
NCMB(Nifty cloud mobile backend)での署名認証自体はシグネチャの生成方法に書いてます。今回のはコレをnode.jsでやるにはどうしたら良いの かなーのサンプルです。
var crypto = require("crypto");
var url = "https://mb.api.cloud.nifty.com/2013-09-01/login"
+ "?userName=" + process.env.USER_NAME
+ "&password=" + process.env.USER_PASS;
var method = 'GET';
var signature = "";
var _applicationKey = process.env.NCMB_APP_KEY;
var _timestamp = new Date().toISOString();
var _clientKey = process.env.NCMB_CLIENT_KEY;
var _method = method;
var _url = encodeURI(url);
var _tmp = _url.substring(_url.lastIndexOf("//") + 2);
var _fqdn = _tmp.substring(0, _tmp.indexOf("/"));
var _position = _url.indexOf("?");
var _path = "";
var _data = {};
if(_position == -1) {
_path = _url.substring(_url.lastIndexOf(_fqdn) + _fqdn.length );
} else {
var _get_parameter= _url.substring(_position + 1);
_path = _url.substring(_url.lastIndexOf(_fqdn) + _fqdn.length, _position);
_tmp = _get_parameter.split("&");
for (var i = 0; i < _tmp.length; i++) {
_position = _tmp[i].indexOf("=");
_data[_tmp[i].substring(0 , _position)] = _tmp[i].substring(_position + 1);
}
}
_data["SignatureMethod"] = "HmacSHA256";
_data["SignatureVersion"] = "2";
_data["X-NCMB-Application-Key"] = _applicationKey;
_data["X-NCMB-Timestamp"] = _timestamp;
var _sorted_data = {};
var keys = [];
var k, i, len;
for (k in _data) {
if (_data.hasOwnProperty(k)) {
keys.push(k);
}
}
keys.sort();
len = keys.length;
for (i = 0; i < len; i++) {
k = keys[i];
_sorted_data[k] = _data[k];
}
var parameterString = "";
for (k in _sorted_data) {
if (_sorted_data.hasOwnProperty(k)) {
if (parameterString != "") {
parameterString += "&";
};
parameterString = parameterString + k + "=" + _sorted_data[k];
}
}
var forEncodeString = _method + "\n" + _fqdn + "\n" + _path + "\n" + parameterString;
var signature = crypto.createHmac("SHA256", _clientKey).update(forEncodeString).digest('base64');
console.log(signature);
ていうか本家が出してるJS(ブラウザ)版の最後だけnodeのcryptoに変えただけだったりしてw