Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/kubernetes/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Intuit API OAuth应用程序身份验证失败;错误代码=003200_Api_Oauth_Coldfusion_Quickbooks Online_Intuit - Fatal编程技术网

Intuit API OAuth应用程序身份验证失败;错误代码=003200

Intuit API OAuth应用程序身份验证失败;错误代码=003200,api,oauth,coldfusion,quickbooks-online,intuit,Api,Oauth,Coldfusion,Quickbooks Online,Intuit,我正在使用连接到QuickBooks Online API。我能够成功地使用三条腿身份验证并取回访问令牌。我还能够毫无问题地连接到大多数端点。但是,我在使用URL参数连接端点时遇到问题 例如,此URL返回时没有问题: https://sandbox-quickbooks.api.intuit.com/v3/company/123145723805019/customer/8 但是,此URL返回时带有SignatureBasString:error 401 unAuthorized //sandb

我正在使用连接到QuickBooks Online API。我能够成功地使用三条腿身份验证并取回访问令牌。我还能够毫无问题地连接到大多数端点。但是,我在使用URL参数连接端点时遇到问题

例如,此URL返回时没有问题:

https://sandbox-quickbooks.api.intuit.com/v3/company/123145723805019/customer/8

但是,此URL返回时带有SignatureBasString: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>

不工作代码:

<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>

错误响应:

<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>

消息=ApplicationAuthenticationFailed;错误代码=003200;状态代码=401
SignatureBasString:GET&;https%3A%2F%2Fsandbox quickbooks.api.intuit.com%2Fv3%2Fcompany%2F123145723805019%2Fquery&;oauth用户密钥%3DqyprdTVZH2CtDAXewG1YQKQYzUssYH%26oauth当前%3d420adb0bf9ef309b785c531ee8aaf%26oauth签名方法%3DHMAC-SHA1%26oauth时间戳%3D1480601520%26oauth令牌%3dqyprd5g2weiaxavyi3mqrvxvi26uauymtfqamzhdjvt%260eau版本%3D1.0%2520ca%252OAuth用户查询%0%2520ca%

在将查询语句传递到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”参数的默认值不变。

OAuth等对签名非常挑剔。这只是猜测,但我怀疑当URL中直接包含查询字符串参数时,签名的计算不正确。相反,请尝试通过
addParameter()
@Leigh谢谢,将参数添加到
oAuthRequest
对象中-我想我以前已经尝试过了,但只是为了确保我再次尝试使用(编辑):好的,我暂时没有主意,但稍后有机会时会尝试一下。同时,你可以发布QB文档的URL,显示你试图复制的“客户”示例吗?我知道这有点老套。你有没有想过?与似乎是同一个问题的斗争。(虽然,我在Ruby工作。)谢谢,但不工作。我尝试了以下方法,它创建的URL是这样的:如果检查生成的http请求的其余部分,它与他们的工具相比如何?忽略字符集,它似乎有正确的部分,Auth头看起来类似-尽管“誓言xxx”参数的顺序似乎略有不同(不确定这是否重要)。@Leigh如果我使用他们的API资源管理器,它会显示以下请求URI:请求头:接受:应用程序/json授权:OAuth OAuth\u令牌=“**********”,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%2fhsg5eteyn2drur%TF2BOPQ%3D“intuit_tid:idg-ajrnbybr1pfzjregh1gzsjo2-5535777用户代理:APIExplorer@Leigh它还可以使用Postman chrome应用程序成功运行。我不确定授权中变量的顺序是否重要。我不认为很可能不重要,但有些API很挑剔,所以值得一提。尝试检查成功的邮递员请求和由CFC生成的http头,看看有什么不同。如果需要,您可以随时修改CFC以使用相同的值(即动态填充、时间戳、nonce等)