首页 > 解决方案 > 套件中的 Rest SuiteTalk 身份验证问题

问题描述

我正在尝试创建一个使用 rest Suitetalk 执行 SuiteQL 的套件,但我正在努力进行身份验证,我可以使用 Postman 毫无问题地执行请求,但它无法在具有相同凭据的套件中工作,我只收到错误“INVALID_LOGIN”

我正在使用库 CRYPTO-JS 来生成签名,代码如下:

const onRequest = (context) => {


let account = "XXXXXXXXXXXXXXXXXXXXXXX";
let consumerKey =
  "XXXXXXXXXXXXXXXXXXXXXXX";
let consumerSecret =
"XXXXXXXXXXXXXXXXXXXXXXX";
let tokenId =
"XXXXXXXXXXXXXXXXXXXXXXX";
let tokenSecret = "";

  var timestamp = Math.round(new Date().getTime() / 1000); //new Date().getTime().toString().substring(0, 10);
  var nonce = generateNonce();
  let data = "";
  data = data + "oauth_consumer_key=" + consumerKey + "&";
  data = data + "oauth_nonce=" + nonce + "&";
  data = data + "oauth_signature_method=" + "HMAC-SHA256" + "&";
  data = data + "oauth_timestamp=" + timestamp + "&";
  data = data + "oauth_token=" + tokenId + "&";
  data = data + "oauth_version=" + "1.0";
  const encodedData = encodeURIComponent(data);
  let baseString =
    "POST&" +
    encodeURIComponent(
      "https://xxxxxxxxxx.suitetalk.api.netsuite.com/services/rest/query/v1/suiteql"
    ) +
    "&" +
    encodedData;

  let keystring = `${consumerSecret}&${tokenSecret}`;
  var signature = CryptoJS.HmacSHA256(baseString, keystring).toString(
    CryptoJS.enc.Base64
  );
try {
  var objResponse = {};
  let headerJSON = {
    Authorization:
      'OAuth realm="' +
      account +
      '",oauth_consumer_key="' +
      consumerKey +
      '",oauth_token="' +
      tokenId +
      '",oauth_signature_method="HMAC-SHA256",oauth_timestamp="' +
      timestamp +
      '",oauth_nonce="' +
      nonce +
      '",oauth_version="1.0",oauth_signature="' +
      encodeURIComponent(signature) +
      '"',
    "Content-Type": "application/json",
    Prefer: "transient",
  };
  log.debug("auth string", headerJSON.Authorization);
  let requestBody = {
    q: "SELECT * FROM item where isonline='T'",
  };

  objResponse = https.post({
    url: "https://XXXXXXX.suitetalk.api.netsuite.com/services/rest/query/v1/suiteql",
    headers: headerJSON,
    body: JSON.stringify(requestBody),
  });

  context.response.write(objResponse.body);
} catch (err) {
  log.debug("Suitetalk call failed", err);
}};

标签: suitescriptsuitetalk

解决方案


推荐阅读