【问题标题】:Intuit API OAuth ApplicationAuthenticationFailed; errorCode=003200Intuit API OAuth ApplicationAuthenticationFailed;错误代码=003200
【发布时间】: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&amp;https%3A%2F%2Fsandbox-quickbooks.api.intuit.com%2Fv3%2Fcompany%2F123145723805019%2Fquery&amp;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


【解决方案1】:

在将查询语句传递到 URL 之前对其进行编码。

使用以下方法进行编码:

<cffunction name="encodePercent" returntype="string" access="public"
            description="RFC 3986 encoding - keep [ALPHA, DIGIT, '-', '.', '_', '~'], %-encode the rest -> decoding '~', correctly encoding spaces('+') and '*'">
    <cfargument name="sValue"       required="true" type="string" hint="value to encode">
    <cfargument name="sEncoding"    required="false" type="string" default="UTF-8" hint="encoding">
    <cfset var sResult = "">
    <!--- using javacast to call the appropriate encode method --->
    <cfif Len(arguments.sValue)>
        <cfset sResult = CreateObject("java","java.net.URLEncoder").
                            encode(JavaCast("String",arguments.sValue), JavaCast("String",arguments.sEncoding))>
        <cfset sResult = Replace(sResult,"+","%20","all")>
        <cfset sResult = Replace(sResult,"*","%2A","all")>
        <cfset sResult = Replace(sResult,"%7E","~","all")>
    </cfif>

    <cfreturn sResult>
</cffunction>

您可以保持“sEncoding”参数的默认值不变。

【讨论】:

  • 谢谢,但不起作用。我尝试了以下 sandbox-quickbooks.api.intuit.com/v3/company/123145723805019/…" & urlparam & "&minorversion=4") /> 它创建的 URL 看起来像这样: sandbox-quickbooks.api.intuit.com/v3/company/123145723805019/…
  • 如果您检查生成的 http 请求的其余部分,它与他们的工具相比如何?忽略字符集,它似乎有正确的部分,并且 Auth 标头看起来相似 - 尽管“oath_xxx”参数的顺序似乎略有不同(不确定这是否重要)。
  • @Leigh 如果我使用他们的 API 资源管理器,它会显示以下请求 URI:sandbox-quickbooks.api.intuit.com/v3/company/123145723805019/… 请求标头:接受:application/json 授权:OAuth oauth_token="************ **",oauth_nonce="77bb5009-69b1-4aad-ae3c-cb9dc66433d7",oauth_consumer_key="************",oauth_signature_method="HMAC-SHA1",oauth_timestamp="1480686014",oauth_version ="1.0",oauth_signature="w1Z%2FHSG5ETeynZ4DN2RUr%2BTFOpQ%3D" intuit_tid: idg-ajrnbybr1pfzjregh1gzsjo2-5535777 用户代理: APIExplorer
  • @Leigh 它也可以使用 Postman chrome 应用程序成功运行。我不确定授权中变量的顺序是否重要..我不这么认为
  • 可能不是,但有些 API 很挑剔,所以值得一提。尝试检查 CFC 生成的那些成功的 PostMan 请求和 http 标头,看看有什么不同。如果需要,您可以随时修改 CFC 以使用相同的值(即动态内容、时间戳、随机数等......)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-13
  • 2020-08-27
  • 1970-01-01
  • 2016-05-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多