从 Javascript 调用 NetSuite RESTlet:“登录尝试无效”

问题描述 投票:0回答:2

我正在尝试通过 Programiz 在线测试我的 javascript 代码 但我很难弄清楚我哪里出了问题。请发送帮助。

这是我发送请求时收到的回复:

{"error" : {"code" : "INVALID_LOGIN_ATTEMPT", "message" : "Invalid login attempt."}}

当我通过 NetSuite 中的Login Audit Trail进行检查时,与我尝试使用 POSTMAN 时相比,角色没有显示。

var crypto = require("crypto");
var fetch = require('node-fetch');

var url = "https://{accountID}.restlets.api.netsuite.com/app/site/hosting/restlet.nl?script=729&deploy=1";
var realm = "{accountId}";
var signatureMethod = "HMAC-SHA256";
var oauthVersion = "1.0";
var consumerKey = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx";
var consumerSecret = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx";
var tokenId = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx";
var tokenSecret = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx";

var nonce = randomString(10);
var timeStamp = Math.round((new Date()).getTime() / 1000); 
var baseString = realm + "&" + consumerKey + "&" + tokenId + "&" + nonce + "&" + timeStamp;
var signingKey = consumerSecret + "&" + tokenSecret;

var hmac = crypto.createHmac("sha256", signingKey);
hmac.update(baseString);
var signature = encodeURIComponent(hmac.digest("base64"));

var authorizationStr = "OAuth realm=\""+ realm + "\"" +
                      ",oauth_consumer_key=\"" + consumerKey + "\"" +
                      ",oauth_token=\"" + tokenId + "\"" +
                      ",oauth_signature_method=\"" + signatureMethod + "\"" +
                      ",oauth_timestamp=\"" + timeStamp + "\"" + 
                      ",oauth_nonce=\"" + nonce + "\"" + 
                      ",oauth_version=\"" + oauthVersion + "\"" + 
                      ",oauth_signature=\"" + signature + "\"";
console.log("timeStamp: " + timeStamp);
console.log("nonce: " + nonce);
console.log("signature: " + signature);

var raw = JSON.stringify({
  "searchId": "customsearch_pendingso"
});

var requestOptions = {
  method: 'POST',
  headers: {
      "Authorization": authorizationStr,
      "Content-Type": "application/json",
      "Cookie": "NS_ROUTING_VERSION=LAGGING",
      "Cache-Control": "no-cache",
      "Accept": "*/*",
      "Accept-Encoding": "gzip, deflate, br"
  },
  body: raw,
  redirect: 'follow'
};

fetch(url, requestOptions)
  .then(response => response.text())
  .then(result => console.log(result))
  .catch(error => console.log('error', error));

function randomString(length) {
  var text = "";
  var possible = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
  for (var i = 0; i < length; i++) {
    text += possible.charAt(Math.floor(Math.random() * possible.length));
  }
  return text;
}
javascript post oauth netsuite
2个回答
3
投票

这是我的问题的解决方案。

因此,我没有尝试在在线编译器上执行此操作,而是安装了 NodeJS 并使用了oauth-1.0a

var request = require('request');
var OAuth = require('oauth-1.0a');

var realm = "{ACCOUNTID}";

var token = {
    public: "{TOKEN_ID}",
    secret: "{TOKEN_SECRET}"
};

var oauth = OAuth({
    consumer: {
        public: "{CONSUMER_KEY}",
        secret: "{CONSUMER_SECRET}"
    },
    signature_method: "HMAC-SHA256"
});

var request_data = {
    url: "{RESTLET_EXTERNAL_URL}",
    method: 'POST'
};

var request_headers = oauth.toHeader(oauth.authorize(request_data, token));
request_headers.Authorization  += ', realm="' + realm + '"';
request_headers['content-type'] = 'application/json';

var request_payload = {
    "searchId": "customsearch_pendingso"
}

request({
    url: request_data.url,
    method: request_data.method,
    headers: request_headers,
    json: request_payload
}, function(error, response, body) {
    if (error) console.log(error);
    console.log(body);
});

0
投票

您可以在此处查看我的 NodeJS 实现和操作方法:https://github.com/gmihaylov/netsuite-nodejs-reslet-call

希望能有所帮助:)

© www.soinside.com 2019 - 2024. All rights reserved.