【发布时间】:2016-12-01 14:26:41
【问题描述】:
我正在使用this library for OAuth v1.0 连接到 QuickBooks Online API。我成功地能够使用三足身份验证并取回访问令牌。我也能够毫无问题地连接到大多数端点。但是,我在使用 URL 参数连接到端点时遇到问题。
例如,此 URL 没有问题地返回:
https://sandbox-quickbooks.api.intuit.com/v3/company/123145723805019/customer/8
但是,此 URL 返回 SignatureBaseString:error 401 unAuthorized。
//sandbox-quickbooks.api.intuit.com/v3/company/123145723805019/query?query=select * from customer
我是否误解了如何在 OAuth 中使用 URL 参数访问端点?任何帮助或见解将不胜感激。
工作代码:
<cfset oAuthRequest = new com.brianflove.oauth.Request()>
<cfset oAuthConsumer = new com.brianflove.oauth.Consumer()>
<cfset oauthConsumer.setSecret(CONSUMER_SECRET)>
<cfset oauthConsumer.setKey(CONSUMER_KEY)>
<cfset oAuthRequest.setMethod("GET")>
<cfset oAuthRequest.setUrl("https://sandbox-quickbooks.api.intuit.com/v3/company/123145723805019/customer/" & randrange(1,8))>
<cfset oAuthRequest.setConsumer(oAuthConsumer)>
<cfset oAuthRequest.setToken(session.token)>
<!---use HMAC-SHA1 signature method--->
<cfset signatureMethod = new com.brianflove.oauth.methods.HmacSha1SignatureMethod()>
<!---sign request--->
<cfset oAuthRequest.signWithSignatureMethod(signatureMethod=signatureMethod)>
<!---POST using request URL--->
<cfset httpRequest = new Http()>
<cfset httpRequest.setUrl(oAuthRequest.getUrl())>
<cfset httpRequest.setMethod(oAuthRequest.getMethod())>
<cfset httpRequest.addParam(type="header", name="Authorization", value=oAuthRequest.toHeader())>
<cfset httpRequest.addParam(type="header", name="Accept", value="application/json") />
<cfset httpRequest.setCharset("utf-8")>
<cfset httpResult = httpRequest.send().getPrefix()>
<cfdump var="#httpResult.filecontent#">
代码无效:
<cfset oAuthRequest = new com.brianflove.oauth.Request()>
<cfset oAuthConsumer = new com.brianflove.oauth.Consumer()>
<cfset oauthConsumer.setSecret(CONSUMER_SECRET)>
<cfset oauthConsumer.setKey(CONSUMER_KEY)>
<cfset oAuthRequest.setMethod("GET")>
<cfset oAuthRequest.setUrl("https://sandbox-quickbooks.api.intuit.com/v3/company/123145723805019/query?query=select * from customer") />
<cfset oAuthRequest.setConsumer(oAuthConsumer)>
<cfset oAuthRequest.setToken(session.token)>
<!---use HMAC-SHA1 signature method--->
<cfset signatureMethod = new com.brianflove.oauth.methods.HmacSha1SignatureMethod()>
<!---sign request--->
<cfset oAuthRequest.signWithSignatureMethod(signatureMethod=signatureMethod)>
<!---POST using request URL--->
<cfset httpRequest = new Http()>
<cfset httpRequest.setUrl(oAuthRequest.getUrl())>
<cfset httpRequest.setMethod(oAuthRequest.getMethod())>
<cfset httpRequest.addParam(type="header", name="Authorization", value=oAuthRequest.toHeader())>
<cfset httpRequest.addParam(type="header", name="Accept", value="application/json") />
<cfset httpRequest.setCharset("utf-8")>
<cfset httpResult = httpRequest.send().getPrefix()>
<cfdump var="#httpResult.filecontent#">
错误响应:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<IntuitResponse time="2016-12-01T06:12:00.999-08:00" xmlns="http://schema.intuit.com/finance/v3">
<Fault type="AUTHENTICATION">
<Error code="3200">
<Message>message=ApplicationAuthenticationFailed; errorCode=003200; statusCode=401</Message>
<Detail>SignatureBaseString: GET&https%3A%2F%2Fsandbox-quickbooks.api.intuit.com%2Fv3%2Fcompany%2F123145723805019%2Fquery&oauth_consumer_key%3DqyprdTVZH2CtDAXewG1YQKQYzUssYH%26oauth_nonce%3D420ADB0BF9EF309B785C531EEE8A7AAF%26oauth_signature_method%3DHMAC-SHA1%26oauth_timestamp%3D1480601520%26oauth_token%3Dqyprd5g2WEiaxaVyI3MqeXqRvxvi26cXuauyMtFQaMZHdjVT%26oauth_version%3D1.0%26query%3Dselect%2520%252A%2520from%2520customer</Detail>
</Error>
</Fault>
</IntuitResponse>
【问题讨论】:
-
OAuth之类的对签名非常挑剔。只是一个猜测,但我怀疑当查询字符串参数直接包含在 URL 中时,签名计算不正确。相反,请尝试通过
addParameter()将参数添加到oAuthRequest对象。 -
@Leigh 谢谢 - 我想我之前已经尝试过,但只是为了确保我再次使用
sandbox-quickbooks.api.intuit.com/v3/company/123145723805019/…) /> 并得到相同的响应 -
(编辑):好的,我暂时没有想法,但稍后有机会时会尝试一下。同时,您能否发布 QB 文档的 URL,显示您尝试复制的“客户”示例?
-
我知道这有点过时了。你有想过吗?挣扎于看似相同的问题。 (虽然,我正在使用 Ruby。)
标签: api oauth coldfusion quickbooks-online intuit