Netsuite Rest Web Services Подпись - PullRequest
1 голос
/ 24 января 2020

Я работаю над интеграцией с Netsuite Rest Web Services API (не с SOAP / RESTlets). Я полностью функционирую в почтальоне, используя предоставленную коллекцию, но не выяснил фактическую строку для подписи, и документация REST ничего не показывает. Я попытался использовать документацию от других служб, но не go.

Итак, вытащил журнал у почтальона. Я пытался воспроизвести то, что я считаю, используя идентификатор учетной записи, ключ потребителя, токен, создание одноразового номера и отметку времени unix.

GET / rest / платформа / v1 / каталог метаданных / запись? Select = клиент HTTP / 1.1 Принятие: приложение / сваггер + json Авторизация: OAuth realm = "TSTDRV2164811", oauth_consumer_key = "2bb1d46bb5f3a69fdea1eedeb8eeb8d0ea8e8e8b8108b8b8e8b6108b6b6eb6 "02545230f53d0cf8fc5075f8cee01847f28131127fad358501479952bb8ce046", oauth_signature_method = "HMA C -sha1", oauth_timestamp = "1579805526", oauth_nonce = "V5GBSPyMRPB", oauth_version = "1.0", oauth_signature = "rp6xmqnCofmVPl9D0nk48G9DVww% 3D" User-Agent: PostmanRuntime / 7.22.0 кэш -Control: no-cache Почтальон-токен: cbc0f225-374 c -4e cc -8b5b-daf60469137e Хост: tstdrv2164811.suitetalk.api.netsuite.com Принять-кодирование: gzip, deflate, br Cook ie: NS_ROUTING_VERSION = LAGGING Соединение: 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;

Я ожидал бы получить t вышеупомянутое значение, но вместо этого я получаю это

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

Я изменил свой предыдущий код так, как я сейчас пытаюсь, и до сих пор нет go

1 Ответ

0 голосов
/ 28 января 2020

Строка, для которой вы генерируете подпись, должна быть составлена ​​очень определенным образом c.

Операция со всеми прописными буквами + & + URI в кодировке Базовый URL + & + URI в кодировке блок параметров в алфавитном порядке, исключая realm. Также необходимо включить некоторые параметры OAuth в дополнение к любым в самом веб-запросе, например oauth_signature_method.

. Вот пример на другом языке построения строки для подписи.

  // 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)));

Можно не указывать параметры запроса, не указанные в вашем запросе, такие как deploy и script, но необходимо включить все oauth_ и любые дополнительные, включенные в ваш запрос.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...