尝试使用/调用带有基于令牌的身份验证的NetSuite Restlet,使用Delphi RESTClient。我有一个工作邮递员的请求,以验证所有的授权参数所需。在代码中添加一个缺少的参数--王国--确实会更改从NetSuite端返回的错误消息,但仍然不会导致调用成功。
procedure TForm1.OAuth1Authenticator1Authenticate(ARequest: TCustomRESTRequest;
var ADone: Boolean);
begin
// XXXXXXX_RP is a NetSuite account number and environment
ARequest.AddAuthParameter('realm','XXXXXX_RP',pkQUERY);
end;如果未添加领域(上述代码被注释掉),则返回的rest内容如下:
error code: USER_ERROR
error message: header is not NLAuth scheme [ OAuth oauth_consumer_key="fe8da7b31dccbd47e90e5dd5e641fe7b0cbff032a951b4058618c207caf569f8", oauth_nonce="c98fa9de2c601f45bdc8d5c640f1b3cf", oauth_signature_method="HMAC-SHA1", oauth_signature="PfCQE3A4DicTtCfpBEPmbSOmqNg%3D", oauth_timestamp="1568639138", oauth_token="a8190ba34e223f25b32cdb4837d9e1973b8fd6208804e93306f4618ccdb6d648", oauth_version="1.0" ]随着领域的增加,我仍然得到:
error code: INVALID_LOGIN_ATTEMPT
error message: Invalid login attempt.有人成功地使用Delphi RESTClient调用NetSuite restlets吗?
Update:看起来它不支持使用可选的领域参数。手动添加它会将其添加到规范化参数列表中,以便在不应该签名时进行签名。我在REST.Authenticator.OAuth中修改了REST.Authenticator.OAuth以跳过这个参数(只是在一些代码周围添加了一个if Lparam.Name <> 'realm' then begin .. end;块),但是仍然没有成功地向NetSuite发出请求。在阅读了https://oauth.net/core/1.0/ 9.1.1节之后就这样做了。使请求参数正常化:
请求参数被收集、排序并连接到一个规范化字符串中:
发布于 2019-09-23 14:15:11
最后用Indy手工组装请求。下面是组装AUTH报头的部件的副本,以及使用Indy的IdHTTP执行测试请求的代码。注: Netsuite帐号和ID/机密仅供展示。
procedure TForm1.Button1Click(Sender: TObject);
Const
NETSUITE_ACCOUNT_ID = '4000000_RP';
BASE_URL = 'https://4000000-rp.restlets.api.netsuite.com/app/site/hosting/restlet.nl';
HTTP_METHOD = 'POST';
SCRIPT_ID = '331';
SCRIPT_DEPLOYMENT_ID = 'customdeploy_salesorderimport';
OAUTH_VERSION = '1.0';
TOKEN_ID = 'a8190ba34e223f25b3267843437d9e1973b8fd6208804e93306f4618ccdb6d648';
TOKEN_SECRET = 'ecb5321eaf832714828ede7f920320b942ad6b2d4221da3b12496f389d68e1c4';
CONSUMER_KEY = 'fe8da7c2cbd47e90e5dd5e6415fe7b0cbff2032a5951b4058618c07c7af569f8';
CONSUMER_SECRET = '848cae6150a651ecbc6975656f4b92ca08d7c27c829185cf98e7a0a30c24dbc2';
Var
OAUTH_NONCE,TIME_STAMP,STRING2SIGN : string;
oauth_signature, oauth, BaseURL : string;
JSONValue : TJsonValue;
begin
OAUTH_NONCE := THashMD5.GetHashString(IntToStr(DateTimeToUnix(TTimeZone.Local.ToUniversalTime(Now))) + IntToStr(Random(MAXINT)));
TIME_STAMP := IntToStr(DateTimeToUnix(TTimeZone.Local.ToUniversalTime(Now)));
// These are in alphabetical order - 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-SHA256' + '&';
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(THashSHA2.GetHMACAsBytes(STRING2SIGN, CONSUMER_SECRET + '&' + TOKEN_SECRET)));
oauth :='OAuth oauth_signature="' + oauth_signature + '",';
oauth := oauth + 'oauth_version="' + OAUTH_VERSION + '",';
oauth := oauth + 'oauth_nonce="' + OAUTH_NONCE + '",';
oauth := oauth + 'oauth_signature_method="HMAC-SHA256",';
oauth := oauth + 'oauth_consumer_key="' + CONSUMER_KEY + '",';
oauth := oauth + 'oauth_token="' + TOKEN_ID + '",';
oauth := oauth + 'oauth_timestamp="' + TIME_STAMP + '",';
oauth := oauth + 'realm="' + NETSUITE_ACCOUNT_ID + '"';
BaseURL := BASE_URL + '?script=' + SCRIPT_ID + '&deploy=' + SCRIPT_DEPLOYMENT_ID;
IdHTTP1.Request.CustomHeaders.FoldLines := false;
IdHTTP1.Request.Accept := 'application/json, text/javascript, */*; q=0.01';
IdHTTP1.Request.ContentType := 'application/json';
IdHTTP1.Request.CustomHeaders.Values['Authorization'] := oauth;
try
memo1.Text := idhttp1.Post(BaseURL,'C:\Users\bevans\Documents\Json.txt');
JSONValue := TJSonObject.ParseJSONValue(memo1.Text);
SynEdit1.Text := JSonValue.Format;
finally
JSonValue.Free;
end;注意:更新的代码使用SHA256而不是SHA1进行OAUTH签名。NetSuite已经发出通知,他们将在NetSuite 2021.2版中要求这样做。
https://stackoverflow.com/questions/57957730
复制相似问题