Jira Code : NT-56
During any integration of NetSuite and other third-party applications, we need to create tokens for providing a request to NetSuite over REST API. We need to generate NetSuite authentication token for the application which we used to integrate with NetSuite. The following is javascript to generate tokens.
NT 56 JJ SL Generate Token
function main(req, res) {
var frm = nlapiCreateForm("Generate Token Based Authentication Header for Restlet");
if (req.method === "GET") {
generateForm(frm);
} else if (req.method === "POST") {
var CONSUMER_KEY = req.getParameter('custpage_conskey');
var CONSUMER_SECRET = req.getParameter('custpage_conssecret');
var TOKEN_ID = req.getParameter('custpage_tokenid');
var TOKEN_SECRET = req.getParameter('custpage_tokensecret');
var SCRIPT_DEPLOYMENT_ID = req.getParameter('custpage_deploymentid');
var OAUTH_NONCE = getNonce(32);
var TIME_STAMP = Math.round(+new Date() / 1000);
var OAUTH_VERSION = '1.0';
var SCRIPT_ID = req.getParameter('custpage_scriptid');
var HTTP_METHOD = req.getParameter('custpage_httpmethod').toUpperCase();
var BASE_URL = req.getParameter('custpage_baseurl');
var NETSUITE_ACCOUNT_ID = req.getParameter('custpage_accountid');
var PARAMETER = req.getParameter('custpage_parameter');
nlapiLogExecution('debug', 'CONSUMER_KEY', CONSUMER_KEY);
nlapiLogExecution('debug', 'CONSUMER_SECRET', CONSUMER_SECRET);
nlapiLogExecution('debug', 'TOKEN_ID', TOKEN_ID);
nlapiLogExecution('debug', 'TOKEN_SECRET', TOKEN_SECRET);
nlapiLogExecution('debug', 'SCRIPT_DEPLOYMENT_ID', SCRIPT_DEPLOYMENT_ID);
nlapiLogExecution('debug', 'OAUTH_NONCE', OAUTH_NONCE);
nlapiLogExecution('debug', 'TIME_STAMP', TIME_STAMP);
nlapiLogExecution('debug', 'OAUTH_VERSION', OAUTH_VERSION);
nlapiLogExecution('debug', 'SCRIPT_ID', SCRIPT_ID);
nlapiLogExecution('debug', 'HTTP_METHOD', HTTP_METHOD);
nlapiLogExecution('debug', 'BASE_URL', BASE_URL);
nlapiLogExecution('debug', 'NETSUITE_ACCOUNT_ID', NETSUITE_ACCOUNT_ID);
nlapiLogExecution('debug', 'PARAMETER', PARAMETER);
generateForm(frm);
var data = '';
//data = data + 'count=5&';
data = data + 'deploy=' + SCRIPT_DEPLOYMENT_ID + '&';
data = data + 'oauth_consumer_key=' + CONSUMER_KEY + '&';
data = data + 'oauth_nonce=' + OAUTH_NONCE + '&';
data = data + 'oauth_signature_method=' + 'HMAC-SHA1' + '&';
data = data + 'oauth_timestamp=' + TIME_STAMP + '&';
data = data + 'oauth_token=' + TOKEN_ID + '&';
data = data + 'oauth_version=' + OAUTH_VERSION + '&';
if (HTTP_METHOD == 'POST' || HTTP_METHOD == 'PUT') {
nlapiLogExecution('debug', 'post or put');
data = data + 'script=' + SCRIPT_ID;
} else if (HTTP_METHOD == 'GET' || HTTP_METHOD == 'DELETE') {
nlapiLogExecution('debug', 'get or delete ');
data = data + 'script=' + SCRIPT_ID + '&';
data = data + 'uniid=' + PARAMETER;
} else {
nlapiLogExecution('debug', 'success');
}
var encodedData = encodeURIComponent(data);
var completeData = HTTP_METHOD + '&' + encodeURIComponent(BASE_URL) + '&' + encodedData;
var hmacsha1Data = CryptoJS.HmacSHA1(completeData, CONSUMER_SECRET + '&' + TOKEN_SECRET);
var base64EncodedData = CryptoJS.enc.Base64.stringify(hmacsha1Data);
var oauth_signature = encodeURIComponent(base64EncodedData);
var OAuth = 'OAuth oauth_signature="' + oauth_signature + '",';
OAuth = OAuth + 'oauth_version="1.0",';
OAuth = OAuth + 'oauth_nonce="' + OAUTH_NONCE + '",';
OAuth = OAuth + 'oauth_signature_method="HMAC-SHA1",';
OAuth = OAuth + 'oauth_consumer_key="' + CONSUMER_KEY + '",';
OAuth = OAuth + 'oauth_token="' + TOKEN_ID + '",';
OAuth = OAuth + 'oauth_timestamp="' + TIME_STAMP + '",';
OAuth = OAuth + 'realm="' + NETSUITE_ACCOUNT_ID + '"';
frm.addField('custpage_oauth', 'textarea', 'OAuth').setDefaultValue(OAuth);
}
res.writePage(frm);
}
//Get Unique Value to be pass in header
function getNonce(length) {
var text = "";
var possible = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
for (var i = 0; i < length; i++) {
text += possible.charAt(Math.floor(Math.random() * possible.length));
}
return text;
}
//Adding Objects for Form
function generateForm(frm) {
frm.addField('custpage_conskey', 'text', 'Consumer Key').setMandatory(true);
frm.addField('custpage_conssecret', 'text', 'Consumer Secret').setMandatory(true);
frm.addField('custpage_tokenid', 'text', 'Token Id').setMandatory(true);
frm.addField('custpage_tokensecret', 'text', 'Token Secret').setMandatory(true);
frm.addField('custpage_scriptid', 'text', 'Script Id').setMandatory(true);
frm.addField('custpage_deploymentid', 'text', 'Deployment Id').setMandatory(true);
frm.addField('custpage_httpmethod', 'text', 'Http Method').setMandatory(true);
frm.addField('custpage_baseurl', 'text', 'Restlet Base URL').setMandatory(true);
frm.addField('custpage_accountid', 'text', 'Account ID').setMandatory(true);
frm.addField('custpage_parameter', 'text', 'Parameter')
frm.addSubmitButton('Generate');
}
// Base 64 and HMAC-SHA1 Encoding Libraries
/*
CryptoJS v3.1.2
code.google.com/p/crypto-js
(c) 2009-2013 by Jeff Mott. All rights reserved.
code.google.com/p/crypto-js/wiki/License
*/
var CryptoJS = CryptoJS || function(g, l) {
var e = {},
d = e.lib = {},
m = function() {},
k = d.Base = {
extend: function(a) {
m.prototype = this;
var c = new m;
a && c.mixIn(a);
c.hasOwnProperty("init") || (c.init = function() { c.$super.init.apply(this, arguments) });
c.init.prototype = c;
c.$super = this;
return c
},
create: function() {
var a = this.extend();
a.init.apply(a, arguments);
return a
},
init: function() {},
mixIn: function(a) {
for (var c in a) a.hasOwnProperty(c) && (this[c] = a[c]);
a.hasOwnProperty("toString") && (this.toString = a.toString)
},
clone: function() { return this.init.prototype.extend(this) }
},
p = d.WordArray = k.extend({
init: function(a, c) {
a = this.words = a || [];
this.sigBytes = c != l ? c : 4 * a.length
},
toString: function(a) { return (a || n).stringify(this) },
concat: function(a) {
var c = this.words,
q = a.words,
f = this.sigBytes;
a = a.sigBytes;
this.clamp();
if (f % 4)
for (var b = 0; b < a; b++) c[f + b >>> 2] |= (q[b >>> 2] >>> 24 - 8 * (b % 4) & 255) << 24 - 8 * ((f + b) % 4);
else if (65535 < q.length)
for (b = 0; b < a; b += 4) c[f + b >>> 2] = q[b >>> 2];
else c.push.apply(c, q);
this.sigBytes += a;
return this
},
clamp: function() {
var a = this.words,
c = this.sigBytes;
a[c >>> 2] &= 4294967295 <<
32 - 8 * (c % 4);
a.length = g.ceil(c / 4)
},
clone: function() {
var a = k.clone.call(this);
a.words = this.words.slice(0);
return a
},
random: function(a) { for (var c = [], b = 0; b < a; b += 4) c.push(4294967296 * g.random() | 0); return new p.init(c, a) }
}),
b = e.enc = {},
n = b.Hex = {
stringify: function(a) {
var c = a.words;
a = a.sigBytes;
for (var b = [], f = 0; f < a; f++) {
var d = c[f >>> 2] >>> 24 - 8 * (f % 4) & 255;
b.push((d >>> 4).toString(16));
b.push((d & 15).toString(16))
}
return b.join("")
},
parse: function(a) {
for (var c = a.length, b = [], f = 0; f < c; f += 2) b[f >>> 3] |= parseInt(a.substr(f,
2), 16) << 24 - 4 * (f % 8);
return new p.init(b, c / 2)
}
},
j = b.Latin1 = {
stringify: function(a) {
var c = a.words;
a = a.sigBytes;
for (var b = [], f = 0; f < a; f++) b.push(String.fromCharCode(c[f >>> 2] >>> 24 - 8 * (f % 4) & 255));
return b.join("")
},
parse: function(a) { for (var c = a.length, b = [], f = 0; f < c; f++) b[f >>> 2] |= (a.charCodeAt(f) & 255) << 24 - 8 * (f % 4); return new p.init(b, c) }
},
h = b.Utf8 = { stringify: function(a) { try { return decodeURIComponent(escape(j.stringify(a))) } catch (c) { throw Error("Malformed UTF-8 data"); } }, parse: function(a) { return j.parse(unescape(encodeURIComponent(a))) } },
r = d.BufferedBlockAlgorithm = k.extend({
reset: function() {
this._data = new p.init;
this._nDataBytes = 0
},
_append: function(a) {
"string" == typeof a && (a = h.parse(a));
this._data.concat(a);
this._nDataBytes += a.sigBytes
},
_process: function(a) {
var c = this._data,
b = c.words,
f = c.sigBytes,
d = this.blockSize,
e = f / (4 * d),
e = a ? g.ceil(e) : g.max((e | 0) - this._minBufferSize, 0);
a = e * d;
f = g.min(4 * a, f);
if (a) {
for (var k = 0; k < a; k += d) this._doProcessBlock(b, k);
k = b.splice(0, a);
c.sigBytes -= f
}
return new p.init(k, f)
},
clone: function() {
var a = k.clone.call(this);
a._data = this._data.clone();
return a
},
_minBufferSize: 0
});
d.Hasher = r.extend({
cfg: k.extend(),
init: function(a) {
this.cfg = this.cfg.extend(a);
this.reset()
},
reset: function() {
r.reset.call(this);
this._doReset()
},
update: function(a) {
this._append(a);
this._process();
return this
},
finalize: function(a) { a && this._append(a); return this._doFinalize() },
blockSize: 16,
_createHelper: function(a) { return function(b, d) { return (new a.init(d)).finalize(b) } },
_createHmacHelper: function(a) {
return function(b, d) {
return (new s.HMAC.init(a,
d)).finalize(b)
}
}
});
var s = e.algo = {};
return e
}(Math);
(function() {
var g = CryptoJS,
l = g.lib,
e = l.WordArray,
d = l.Hasher,
m = [],
l = g.algo.SHA1 = d.extend({
_doReset: function() { this._hash = new e.init([1732584193, 4023233417, 2562383102, 271733878, 3285377520]) },
_doProcessBlock: function(d, e) {
for (var b = this._hash.words, n = b[0], j = b[1], h = b[2], g = b[3], l = b[4], a = 0; 80 > a; a++) {
if (16 > a) m[a] = d[e + a] | 0;
else {
var c = m[a - 3] ^ m[a - 8] ^ m[a - 14] ^ m[a - 16];
m[a] = c << 1 | c >>> 31
}
c = (n << 5 | n >>> 27) + l + m[a];
c = 20 > a ? c + ((j & h | ~j & g) + 1518500249) : 40 > a ? c + ((j ^ h ^ g) + 1859775393) : 60 > a ? c + ((j & h | j & g | h & g) - 1894007588) : c + ((j ^ h ^
g) - 899497514);
l = g;
g = h;
h = j << 30 | j >>> 2;
j = n;
n = c
}
b[0] = b[0] + n | 0;
b[1] = b[1] + j | 0;
b[2] = b[2] + h | 0;
b[3] = b[3] + g | 0;
b[4] = b[4] + l | 0
},
_doFinalize: function() {
var d = this._data,
e = d.words,
b = 8 * this._nDataBytes,
g = 8 * d.sigBytes;
e[g >>> 5] |= 128 << 24 - g % 32;
e[(g + 64 >>> 9 << 4) + 14] = Math.floor(b / 4294967296);
e[(g + 64 >>> 9 << 4) + 15] = b;
d.sigBytes = 4 * e.length;
this._process();
return this._hash
},
clone: function() {
var e = d.clone.call(this);
e._hash = this._hash.clone();
return e
}
});
g.SHA1 = d._createHelper(l);
g.HmacSHA1 = d._createHmacHelper(l)
})();
(function() {
var g = CryptoJS,
l = g.enc.Utf8;
g.algo.HMAC = g.lib.Base.extend({
init: function(e, d) {
e = this._hasher = new e.init;
"string" == typeof d && (d = l.parse(d));
var g = e.blockSize,
k = 4 * g;
d.sigBytes > k && (d = e.finalize(d));
d.clamp();
for (var p = this._oKey = d.clone(), b = this._iKey = d.clone(), n = p.words, j = b.words, h = 0; h < g; h++) n[h] ^= 1549556828, j[h] ^= 909522486;
p.sigBytes = b.sigBytes = k;
this.reset()
},
reset: function() {
var e = this._hasher;
e.reset();
e.update(this._iKey)
},
update: function(e) { this._hasher.update(e); return this },
finalize: function(e) {
var d =
this._hasher;
e = d.finalize(e);
d.reset();
return d.finalize(this._oKey.clone().concat(e))
}
})
})();
/*
CryptoJS v3.0.2
code.google.com/p/crypto-js
(c) 2009-2012 by Jeff Mott. All rights reserved.
code.google.com/p/crypto-js/wiki/License
*/
(function() {
var h = CryptoJS,
i = h.lib.WordArray;
h.enc.Base64 = {
stringify: function(b) {
var e = b.words,
f = b.sigBytes,
c = this._map;
b.clamp();
for (var b = [], a = 0; a < f; a += 3)
for (var d = (e[a >>> 2] >>> 24 - 8 * (a % 4) & 255) << 16 | (e[a + 1 >>> 2] >>> 24 - 8 * ((a + 1) % 4) & 255) << 8 | e[a + 2 >>> 2] >>> 24 - 8 * ((a + 2) % 4) & 255, g = 0; 4 > g && a + 0.75 * g < f; g++) b.push(c.charAt(d >>> 6 * (3 - g) & 63));
if (e = c.charAt(64))
for (; b.length % 4;) b.push(e);
return b.join("")
},
parse: function(b) {
var b = b.replace(/\s/g, ""),
e = b.length,
f = this._map,
c = f.charAt(64);
c && (c = b.indexOf(c), -1 != c && (e = c));
for (var c = [], a = 0, d = 0; d < e; d++)
if (d % 4) {
var g = f.indexOf(b.charAt(d - 1)) << 2 * (d % 4),
h = f.indexOf(b.charAt(d)) >>> 6 - 2 * (d % 4);
c[a >>> 2] |= (g | h) << 24 - 8 * (a % 4);
a++
} return i.create(c, a)
},
_map: "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="
}
})();