You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

NetSuite OAuth1.0签名REST API调用遇Cookie头设置拒绝错误求助

NetSuite TBA OAuth1.0签名实现问题:Cookie头设置错误+签名匹配失败

我已经查遍了所有相关文档和关于NetSuite TBA OAuth1.0签名的讨论帖,确认密钥创建正确、所有要求都满足,但调用接口时还是报**"Refused to set unsafe header 'Cookie'"**错误。

我已经做了这些尝试:

  • 用Postman成功建立了连接
  • 在Chrome中禁用CORS策略后发起请求
  • 尝试了所有可能的基础字符串参数组合

我没法复现Postman生成的签名,但看到有帖子说这不一定代表我的实现有问题,因为Postman用了特定的内部参数/变量(不确定这个说法准不准)。

我严格遵循了Oracle官方文档,也参考了Stack Overflow上最接近的解决方案,但NetSuite已经不支持HMAC-SHA1了,所以我改用了HMAC-SHA256,其余参数都按要求提供(还额外加了文档里的部分参数)。

另外一个问题是所有示例都是PHP写的,我得转成JavaScript,但我从没用过PHP,不确定是不是编码方法搞错了。

以下是我的代码:

import axios from 'axios';
import { nanoid } from 'nanoid';
import hmacSHA256 from 'crypto-js/hmac-sha256'
import base64 from 'crypto-js/enc-base64'

function encodeRFC3986URIComponent(str: string) {
    return encodeURIComponent(str)
        .replace(
            /[!'()*]/g,
            (c) => `%${c.charCodeAt(0).toString(16).toUpperCase()}`
        );
}

const parameters = {
    grant_type: "client_credentials",
    oauth_consumer_key: consumerKey,              
    oauth_signature_method: "HMAC-SHA256",
    oauth_timestamp: timeStamp,
    oauth_token: accessToken,
    oauth_nonce: nonce,
    oauth_version: "1.0",
};

const signatureKey = encodeURIComponent(consumerSecret) + '&' + encodeURIComponent(tokenSecret)
console.log('signatureKey: ', signatureKey)

var baseString = httpMethod + '&' + requestURL;

for (const key in parameters) {
    baseString += "&" + key + "=" + parameters[key as keyof object];
}

const encodedBaseString = encodeRFC3986URIComponent(baseString)

const signature = base64.stringify(hmacSHA256(encodedBaseString, signatureKey));

let data = JSON.stringify({
    "q": "SELECT id, entityid FROM employee WHERE custentity_time_badge = '12345'"
});

let authorizationHeader = 'OAuth realm=' + OauthRealm

for (const key in parameters) {
    authorizationHeader += ',' + key + "=" + parameters[key as keyof object];
}
authorizationHeader += ',oauth_signature=' + signature
authorizationHeader = JSON.stringify(authorizationHeader)

let config = {
    method: 'post',
    maxBodyLength: Infinity,
    url: 'https://5283244-sb2.suitetalk.api.netsuite.com/services/rest/query/v1/suiteql',
    headers: {
        'prefer': 'transient',
        'Content-Type': 'application/json',
        'Authorization': authorizationHeader,
        'Cookie': 'NS_ROUTING_VERSION=LAGGING'
    },
    data: data
};

axios.request(config)
    .then((response) => {
        console.log(JSON.stringify(response.data));
    })
    .catch((error) => {
        console.log(error);
    });

内容的提问来源于stack exchange,提问作者adn

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 23:25:12