!slug 1304

!date 2014/03/18

!draft false

!tags NCMB,nifty cloud mobile backend,Node.js

!! 最近、NCMB(Nifty cloud mobile backend)触ってますが、なぜかnode.jsで利用しないといけなくなり署名認証でごにょごにょした成果をGISTにあげときました。NCMB(Nifty cloud mobile backend)での署名認証自体はシグネチャの生成方法に書いてます。今回のはコレをnode.jsでやるにはどうしたら良いの かなーのサンプルです…

最近、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