繁体   English   中英

Netsuite Rest Web 服务签名

[英]Netsuite Rest Web Services Signature

我正在与 Netsuite Rest Web Services API(不是 SOAP/RESTlets)集成。 我使用提供的集合在邮递员中完全运行,但还没有弄清楚签名的实际字符串,并且 REST 文档没有显示任何内容。 我试图使用来自其他两个服务的文档,但没有使用。

因此,从邮递员那里提取日志,我试图复制我认为它在使用帐户 ID、消费者密钥、令牌、创建随机数和 unix 时间戳时所做的事情。

GET / REST /平台/ V1 /元数据目录/记录选择=客户的HTTP / 1.1接受:应用/招摇+ JSON授权:OAuth的境界= “TSTDRV2164811”,oauth_consumer_key = “2bb1d46bb5f3a69fdea1ede39bf46e186bd860a15d8deaf51f7488b1e09bd2a2” 的oauth_token = “02545230f53d0cf8fc5075f8cee01847f28131127fad358501479952bb8ce046”,oauth_signature_method = "HMAC-SHA1", oauth_timestamp="1579805526", oauth_nonce="V5GBSPyMRPB", oauth_version="1.0", oauth_signature="rp6xmqnCofmVPl9D0nk48G9DVww%3D" User-Agent-PostRuntime-Agent-Cacheman PostRun-Agent/7: : cbc0f225-374c-4ecc-8b5b-daf60469137e 主机: tstdrv2164811.suitetalk.api.netsuite.com Accept-Encoding: gzip, deflate, br Cookie: NS_ROUTING_VERSION=LAGGING Connection: keep-alive

<?php

$url = 'https://TSTDRV2164811.suitetalk.api.netsuite.com/rest/platform/v1/metadata-catalog/record?select=customer';
//$url = 'https://rest.netsuite.com/app/site/hosting/restlet.nl?script=6&deploy=1&customParam=someValue&testParam=someOtherValue';
//or https://webservices.netsuite.com/services/NetSuitePort_2015_2 for webservices
$httpMethod = 'GET';
$tokenKey = '02545230f53d0cf8fc5075f8cee01847f28131127fad358501479952bb8ce046';
$tokenSecret = '8c4bb18a6ff15a699825ad833845d0a3dc3abca80aa89abe3c58f77eecd96f9e';
$consumerKey = '2bb1d46bb5f3a69fdea1ede39bf46e186bd860a15d8deaf51f7488b1e09bd2a2';
$consumerSecret = 'a684af8065f75f647ff24f58c3eeb48423907981ea7b93027f53cf63dcfd7626';
$signatureMethod = 'HMAC-SHA1';     //or HMAC-SHA256
$version = '1.0';
$nonce = 'V5GBSPyMRPB';                  //substr(str_shuffle("0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"), 0, 10);
$timestamp = '1579805526';              //  time();
$realm = 'TSTDRV2164811';                   //scompid


$baseString = 'oauth_consumer_key='. $consumerKey;
$baseString .= '&oauth_nonce='. $nonce;
$baseString .= '&oauth_signature_method='. $signatureMethod;
$baseString .= '&oauth_timestamp='. $timestamp;
$baseString .= '&oauth_token='. $tokenKey;
$baseString .= '&oauth_version='. $version;
//$baseString .= '&realm='. $realm;

$base = urlencode($baseString);
$sign = $httpMethod .'&'. urlencode($url) .'&'. $base;
$key = urlencode($consumerSecret) .'&'. urlencode($tokenSecret);

$signature = urlencode(base64_encode(hash_hmac('sha1', $sign, $key, true)));

$output .= sprintf(
    '<root><signature>%s</signature><Nonce>%s</Nonce><Created>%s</Created></root>',
    $signature,
    $nonce,
    $timestamp
);



echo $output;

我希望得到上述值,但我得到了这个

<root>
    <signature><![CDATA[MW0rGmPfcY7yxLOMSWV6jcWs6s8%3D]]></signature>
    <Nonce><![CDATA[V5GBSPyMRPB]]></Nonce>
    <Created><![CDATA[1579805526]]></Created>
</root>

我将之前的代码修改为我目前正在尝试的代码,但仍然没有通过

您生成签名的字符串必须以非常特定的方式构造。

全部大写 + & + URI 编码的操作 Base URL + & + URI 编码的参数块,按字母顺序排列,不包括realm 除了 Web 请求本身中的任何参数(如oauth_signature_method之外,它还需要包含一些 OAuth 参数。

这是一个用不同语言构建要签名的字符串的示例。

  // These are in alphabetical order, lower case - required by signing
  STRING2SIGN := '';
  STRING2SIGN := STRING2SIGN + 'deploy=' + SCRIPT_DEPLOYMENT_ID + '&';
  STRING2SIGN := STRING2SIGN + 'oauth_consumer_key=' + CONSUMER_KEY + '&';
  STRING2SIGN := STRING2SIGN + 'oauth_nonce=' + OAUTH_NONCE + '&';
  STRING2SIGN := STRING2SIGN + 'oauth_signature_method=' + 'HMAC-SHA1' + '&';
  STRING2SIGN := STRING2SIGN + 'oauth_timestamp=' + TIME_STAMP + '&';
  STRING2SIGN := STRING2SIGN + 'oauth_token=' + TOKEN_ID + '&';
  STRING2SIGN := STRING2SIGN + 'oauth_version=' + OAUTH_VERSION + '&';
  STRING2SIGN := STRING2SIGN + 'script=' + SCRIPT_ID;
  STRING2SIGN := URIEncode(STRING2SIGN);
  STRING2SIGN := HTTP_METHOD + '&' + URIEncode(BASE_URL) + '&' + STRING2SIGN;
  oauth_signature := URIEncode(TNetEncoding.Base64.EncodeBytesToString(THashSHA1.GetHMACAsBytes(STRING2SIGN, CONSUMER_SECRET + '&' + TOKEN_SECRET)));

可以在您的请求中省略请求参数,例如deployscript但需要包含所有oauth_参数以及您的请求中包含的任何其他参数。

PostMan 将变量拼接在一起以构建 URL 的方式有些奇怪。 如果您粘贴 URL,而不是从 {{COMPANY_URL}} 构建的 {{REST_SERVICES}},您将获得完全相同的随机数和时间戳值的不同签名。 所以你真的无法比较 PostMan 正在做什么和你自己的代码。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM