Twitter API 在 ColdFusion 中返回 401

标签 twitter coldfusion twitter-oauth coldfusion-9 http-status-code-401

我们正在尝试使用 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/

相关文章:

python - 如何修复 "JSONDecodeError: No JSON object could be decoded: line 1 column 0 (char 0)"?

java - 获取公开 Twitter 个人资料的推文

iPhone + Twitter API : Converting time?

twitter - Twitter 上的 SLComposeViewController : how to detect duplicate post

http - CFHTTP 不通过 SSL 连接进行连接?

coldfusion - 尝试从ColdFusion使用java.lang.string格式方法时获取“The format method was not found”

java - Java 7 上的 ColdFusion 9.01

node.js - 使用 Passport-twitter 设置 locomotivejs 的最佳方法?

node.js - 在node.js中使用passport.js登录Twitter不起作用

objective-c - 将现有 OAuth 凭据迁移到 ACAccountStore 时出错