我们正在尝试使用 ColdFusion 9 通过其 API v. 1.1 向 Twitter 发布更新,但尽管一切看起来都应该有效,但我们仍然收到 401“未经授权”错误。任何帮助将不胜感激!
回顾之前的帖子,我们更加坚信我们所做的一切都是正确的,但也许我们遗漏了一些东西。
以下三种方法都不适合我们(更新在表单字段中;更新在正文字段中;更新是 URL 的一部分。):
<cfhttp url="https://api.twitter.com/1.1/statuses/update.json" method="POST" throwonerror="yes">
<cfhttpparam type="header" name="Authorization" value="OAuth oauth_consumer_key="vAA11oLz0R7kigH0iXwjQ", oauth_nonce="3D18D32A07048D54724AA0F304E83CFF", oauth_signature="TaEA6Ip9AJ07QKTxcWWT4fzPNpA%3D", oauth_signature_method="HMAC-SHA1", oauth_timestamp="1386088450", oauth_token="82684171-ptqIw8uOz0KNwBEL4AO7ue8DpzciWSNKvUqDoAf8p", oauth_version="1.0" ">
<cfhttpparam type="header" name="Content-Type" value="application/x-www-form-urlencoded">
<cfhttpparam type="formfield" name="status" value="HelloWorld" encoded="yes">
</cfhttp>
<cfhttp url="https://api.twitter.com/1.1/statuses/update.json" method="POST" throwonerror="yes">
<cfhttpparam type="header" name="Authorization" value="OAuth oauth_consumer_key="vAA11oLz0R7kigH0iXwjQ", oauth_nonce="3D18D32A07048D54724AA0F304E83CFF", oauth_signature="TaEA6Ip9AJ07QKTxcWWT4fzPNpA%3D", oauth_signature_method="HMAC-SHA1", oauth_timestamp="1386088450", oauth_token="82684171-ptqIw8uOz0KNwBEL4AO7ue8DpzciWSNKvUqDoAf8p", oauth_version="1.0" ">
<cfhttpparam type="header" name="Content-Type" value="application/x-www-form-urlencoded">
<cfhttpparam type="body" value="status=HelloWorld" encoded="yes">
</cfhttp>
<cfhttp url="https://api.twitter.com/1.1/statuses/update.json?status=HelloWorld" method="POST" throwonerror="yes">
<cfhttpparam type="header" name="Authorization" value="OAuth oauth_consumer_key="vAA11oLz0R7kigH0iXwjQ", oauth_nonce="3D18D32A07048D54724AA0F304E83CFF", oauth_signature="TaEA6Ip9AJ07QKTxcWWT4fzPNpA%3D", oauth_signature_method="HMAC-SHA1", oauth_timestamp="1386088450", oauth_token="82684171-ptqIw8uOz0KNwBEL4AO7ue8DpzciWSNKvUqDoAf8p", oauth_version="1.0" ">
<cfhttpparam type="header" name="Content-Type" value="application/x-www-form-urlencoded">
</cfhttp>
Twitter 帐户已授予此应用程序读/写访问权限。我们根据 https://dev.twitter.com/docs/auth/authorizing-request 的指示进行编码和 https://dev.twitter.com/docs/auth/creating-signature我们已经看到了这些页面:ColdFusion Twitter API Bad Request , ColdFusion Post To Twitter Authentication Error , Twitter, oauth and coldfusion , Twitter API status update not working when updating to v1.1我们尝试了 Apigee。
我们使用访问 token 及其 secret 来生成签名。我们在这里缺少什么?这是否应该是发布更新的单步过程,或者我们是否需要在尝试发布之前进行身份验证或授权的步骤? Twitter 开发站点上的 OAuth 工具选项卡生成与我们的 ColdFusion 脚本生成的相同的 header 等。
-肯
最佳答案
在 CF 中处理 OAuth 时,我总是使用这个库:http://oauth.riaforge.org/
这是我用来发送状态更新的一些脚本(它是断章取义的,但应该会给你一些想法):
<cfscript>
//cfcs - from the OAuth library
oauthSigMethodSHA = CreateObject("component", "OAuth.oauthsignaturemethod_hmac_sha1");
oauthRequestCFC = CreateObject("component", "OAuth.oauthrequest");
oauthConsumerCFC = CreateObject("component", "OAuth.oauthconsumer");
oauthTokenCFC = CreateObject("component", "OAuth.oauthtoken");
oTwitterConsumer = oauthConsumerCFC.init(sKey = MyConsumerKey, sSecret = MyConsumerSecret);
ParamsStruct = StructNew();
ParamsStruct['status'] = MyStatus;
oTwitterAccessToken = oauthTokenCFC.init(sKey = MyAccessToken, sSecret = MyAccessSecret);
//create request
oTwitterReqest = oauthRequestCFC.fromConsumerAndToken(
oConsumer : oTwitterConsumer,
oToken : oTwitterAccessToken,
sHttpMethod : "POST",
sHttpURL : 'https://api.twitter.com/1.1/statuses/update.json',
stParameters: ParamsStruct
);
//sign request
oTwitterReqest.signRequest(
oSignatureMethod : oauthSigMethodSHA,
oConsumer : oTwitterConsumer,
oToken : oTwitterAccessToken
);
</cfscript>
<cfhttp method="POST" url="#oTwitterReqest.getString()#" result="result" throwonerror="no" charset="utf-8" redirect="no">
<cfhttpparam type="header" name="status" value="#MyStatus#">
</cfhttp>
关于Twitter API 在 ColdFusion 中返回 401,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20357129/