Netsuite RESTlet 返回 INVALID_REQUEST 响应

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

我已经在标头中使用 Oauth1.0 设置了正确的客户端凭据和访问令牌,以使用基于令牌的身份验证对我的 Netsuite Restlet 进行身份验证,但我收到了 400 错误响应:

error code: INVALID_REQUEST
error message: The request could not be understood by the server due to malformed syntax.

我需要在请求中更改哪些内容才能防止出现此无效请求。

这是我的 RESTlet 文件中的模块规范:

/**
 * @NApiVersion 2.1
 * @NScriptType Restlet
 * @NModuleScope SameAccount
 */
netsuite restlet
2个回答
0
投票

经过一些发现后,我能够从MuleSoft这里找到一些信息,这有助于理解我做错了什么。

我使用邮递员来测试我的端点,但我需要将标头加密从

HMAC-SHA1
更新为
HMAC-SHA256

引用NetSuite文档:

2021.1 无法创建使用 HMAC-SHA1 签名方法的新解决方案。自2021.2起,将不再支持HMAC-SHA1签名方法。在您的账户升级到2021.2之前,您必须更新您的解决方案以使用HMAC-SHA256签名方法。


0
投票

如果您仍然遇到问题: 我假设您正在设置您的签名,对于您的正常请求使用类似的东西,然后使用 HMAC-SHA256:

            data = $"oauth_consumer_key={config["consumerKey"]}" +
                $"&oauth_nonce={oauthNonce}" +
                $"&oauth_signature_method={config["signMethod"]}" +
                $"&oauth_timestamp={timestamp}&oauth_token={config["tokenId"]}" +
                $"&oauth_version={config["oauthVersion"]}";

当您点击 Restlet 的参数端点时...类似于: https://YOURACCOUNTID.restlets.api.netsuite.com/app/site/hosting/restlet.nl?scriptId=SCRIPTID&deployId=DEPLOYID 您需要将它们包含在签名生成中。它们也需要按字母顺序显示。所以上面的内容会变成:

            data = $"deploy={deployNumber}" +
                $"&oauth_consumer_key={config["consumerKey"]}" +
                $"&oauth_nonce={oauthNonce}" +
                $"&oauth_signature_method={config["signMethod"]}" +
                $"&oauth_timestamp={timestamp}&oauth_token={config["tokenId"]}" +
                $"&oauth_version={config["oauthVersion"]}&script={scriptId}";

请注意,在构建签名值和密钥时,您仅传递不带参数的基本脚本 URL:

        var signatureValue = $"POST&Uri.EscapeDataString(https://YOURACCOUNTID.restlets.api.netsuite.com/app/site/hosting/restlet.nl)}&{Uri.EscapeDataString(data)}";
        var signatureKey = $"{Uri.EscapeDataString(config["consumerSecret"])}&{Uri.EscapeDataString(config["tokenSecret"])}";

但是您需要在 HttpRequestMessage 的 post uri 中发送整个 uri(带有查询参数)。

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