【问题标题】:Coldfusion Tumblr oAuth FrustrationColdfusion Tumblr oAuth 受挫
【发布时间】:2013-01-01 15:00:18
【问题描述】:

我意识到这并不是什么新鲜事,并且已经有很多关于这个主题的帖子。但是,与我正在寻找的内容不完全相关......所以,这里是:

我已经查看了有关此主题的所有其他帖子,但似乎没有什么对我有用。以下是我正在做的事情的简要总结:

***我已经在这很长时间了,以至于我忘记了我在哪里 - 我刚刚意识到我的 oauth_signature 现在从我的授权标头中丢失了。我知道它以前在那里......

顺便说一句-我正在使用 Harry Klein (http://oauth.riaforge.org/) 的 CF oauth 应用程序:

<!--- set up the parameters --->
<cfset sConsumerKey = 'xxx'> <!--- Got these from Tumblr for my app --->
<cfset sConsumerSecret = 'xxx'> <!--- Got these from Tumblr for my app --->     
<cfset OAUTH_VERIFIER = 'xxx' /> <!--- Got these when doing oauth registration with tumblr for account --->
<cfset token = 'xxx' /> <!--- Got these when doing oauth registration with tumblr for account --->
<cfset tokenSecret = 'xxx' /> <!--- Got these when doing oauth registration with tumblr for account --->

<!--- set up the required objects including signature method--->
<cfset oReqSigMethodSHA = CreateObject("component", "oauth.oauthsignaturemethod_hmac_sha1")>
<cfset oToken = CreateObject("component", "oauth.oauthtoken").init(sKey = token, sSecret = tokenSecret)>
<cfset oConsumer = CreateObject("component", "oauth.oauthconsumer").init(sKey = sConsumerKey, sSecret = sConsumerSecret)>

<cfset oReq = CreateObject("component", "oauth.oauthrequest").fromConsumerAndToken(
    oConsumer = oConsumer,
    oToken = oToken,
    sHttpMethod = "GET",
    sHttpURL = 'http://api.tumblr.com/v2/user/info')> <!--- For now, just trying to get the user info --->
    <!--- The ultimate goal is to post to differnent blog accounts on tumblr --->

<cfset oReq.setParameter('oauth_verifier',oauth_verifier) /> <!--- Had to manually add in oauth_verifier if it is even needed --->

<cfset oReq.signRequest(
    oSignatureMethod = oReqSigMethodSHA,
    oConsumer = oConsumer,
    oToken = oToken)> <!--- Sign the request --->

<cfhttp url="#oReq.GETNORMALIZEDHTTPURL()#" method="get">
    <cfhttpparam type="header" name="authorization" value="#oReq.TOHEADER()#" />
</cfhttp>

<cfdump var="#cfhttp#" />

这是我得到的一些内容(我添加了换行符以使其更清晰):

SIGNATUREBASESTRING:
    GET&
    http%3A%2F%2Fapi.tumblr.com%2Fv2%2Fuser%2Finfo&
    oauth_consumer_key%3xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx%26
    oauth_nonce%3D96A76129198ADF9B60874521D3FB718256B2D093%26
    oauth_timestamp%3D1358463090%26
    oauth_token%3Dxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx%26
    oauth_verifier%3xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx%26
    oauth_version%3D1.0 

AUTHORIZATION HEADER:
    OAuth oauth_consumer_key="xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
    oauth_timestamp="1358463090",
    oauth_version="1.0",
    oauth_nonce="96A76129198ADF9B60874521D3FB718256B2D093",
    oauth_token="xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
    oauth_verifier="xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" 

每次我尝试修改任何东西时,它都无法正常工作。我总是收到来自 Tumblr 的 401 Not Authorized 回复,但没有解释我做错了什么。

我已经在这几天了:请帮忙

*2013 年 1 月 24 日编辑**

    1. Getting the access_token:
    response from Tumblr to auth_token request (Success):
    oauth_token=XXX&
    oauth_token_secret=XXX&
    oauth_callback_confirmed=true

    2. Using access token to get user info:
    sConsumerKey:
    xxx

    sConsumerSecret:
    yyy

    EndPoint:
    http://api.tumblr.com/v2/user/info

    COMMETHOD:
    get

    token:
    XXX

    tokenSecret:
    XXX

    Signature base string:
    GET&
    http%3A%2F%2Fapi.tumblr.com%2Fv2%2Fuser%2Finfo&
    oauth_consumer_key%3Dxxx&
    oauth_nonce%3DDED2857752C210C71D81DFD549B7B13113DCA50F&
    oauth_signature_method%3DHMAC-SHA1&
    oauth_timestamp%3D1358993908&
    oauth_token%XXX&
    oauth_version%3D1.0

    Signature:
    emffJ8+2QvExJzRH0fgDM8l3jDQ=

    Authorization Header:
    OAuth oauth_consumer_key="xxx"&
    oauth_nonce="DED2857752C210C71D81DFD549B7B13113DCA50F"&
    oauth_signature="emffJ8%2B2QvExJzRH0fgDM8l3jDQ%3D"&
    oauth_signature_method="HMAC-SHA1"&
    oauth_timestamp="1358993908"&
    oauth_token="XXX"&
    oauth_version="1.0" 

验证: 1. OAuth_token 正确。 2. oAuth Header 按字母顺序排序。 3. 签名基本字符串不包含参数,因为没有。 4.方法是get。 5. OAuth Header 包含 oauth_signature。

一些问题是: 1.是否还有其他我需要包含的标题(不确定 CF 是否自动添加任何标题) 2. 任何人都可以验证我的签名基础字符串吗? 3. 签名基串是否有区分大小写的问题? (或其他任何地方)

编辑 - 2013 年 1 月 27 日 任何人都可以确认此信息(我使用的是真实值,因为在包括应用程序本身之后一切都会被重置):

Given:
1. Signature Base String:

GET&
http%3A%2F%2Fapi.tumblr.com%2Fv2%2Fuser%2Finfo&
oauth_consumer_key%XXX%26
oauth_nonce%3DOAUTH7DC9F837D60483B9D10389C9BB0AEAF9%26
oauth_signature_method%3DHMAC-SHA1%26
oauth_timestamp%3D1359320053%26
oauth_token%XXX%26
oauth_version%3D1.0

2. Signing Key (consumer secret & auth_token_secret):
XXX&
XXX

Is this signature correct?

3. Signature:
2n+xbj9gbOrADeaQ3nORKNhOTUg=    

Is this Authorization Header correct:

4. Authorization header (FYI- there is a space after each comma- is that ok?
And- is the encoding on the Signature ok?):
(Also, I've tried this in alphabetical order and not- same result)

OAuth oauth_signature="2n%2Bxbj9gbOrADeaQ3nORKNhOTUg%3D", 
oauth_token="XXX", 
oauth_consumer_key="XXX", 
oauth_nonce="OAUTH7DC9F837D60483B9D10389C9BB0AEAF9", 
oauth_signature_method="HMAC-SHA1", 
oauth_timestamp="1359320053", 
oauth_version="1.0"

我希望有人可以确认这是否正确。在后一种情况下,我会稍微调整一下,并希望再次检查。在此先感谢大家。

【问题讨论】:

  • 阿兰,你删除的“敏感材料”仍然可以在 revision history 中找到 - 如果这些信息真的很敏感,你应该向 Tumblr 索取新的详细信息。
  • 谢谢@PeterBoughton。我将在 Tumblr 上注册一个新应用,但不想宣传旧信息。我没有意识到有修订历史:感谢提醒!

标签: api coldfusion oauth tumblr


【解决方案1】:

我没有专门使用过 Tumblr API,但对你的问题有一些想法。

你没有说你到底想做什么。 您是否成功收到访问令牌?或者您正在尝试使用请求令牌来获取用户信息? - 这行不通。

oauth_verifier 仅在获取访问令牌的过程中需要 - 在使用普通 API 功能(如获取用户信息)时不需要。

对我来说,您似乎正在尝试使用请求令牌来访问用户信息,并且还不必要地将 oauth_verifier 添加到 url。您可能需要阅读 OAuth 1.0a 流程。

希望这会有所帮助。

更新:

这是 OAuth 1.0a 流程的示意图。

The original diagram image here

更新后更新

您说您正在使用http://oauth.riaforge.org/ 此处的库,但我在您的代码中没有看到它。 再说一次 - 我没有专门使用 Tumblr API,但使用上述库最简单的调用我喜欢这样:

<cfscript>
    consumerKey = 'xxx';
    consumerSecret = 'yyy';
    accessToken = 'xxxyyy';
    accessSecret = 'yyyxxx';

    //consumber object
    oauthConsumerCFC = CreateObject("component", "OAuth.oauthconsumer");
    oTumblrConsumer = oauthConsumerCFC.init(sKey = consumerKey, sSecret = consumerSecret);

    //token object
    oauthTokenCFC = CreateObject("component", "OAuth.oauthtoken");
    oTumblrAccessToken = oauthTokenCFC.init(sKey = accessToken, sSecret = accessSecret);

    //request object
    oauthRequestCFC = CreateObject("component", "OAuth.oauthrequest");
    oTumblrReqest = oauthRequestCFC.fromConsumerAndToken(
        oConsumer   : oTumblrConsumer,
        oToken      : oTumblrAccessToken,
        sHttpMethod : "GET",
        sHttpURL    : "http://api.tumblr.com/v2/user/info"
    );

    //signature method
    oauthSigMethodSHA = CreateObject("component", "OAuth.oauthsignaturemethod_hmac_sha1")

    //sign request
    oTumblrReqest.signRequest(
        oSignatureMethod    : oauthSigMethodSHA,
        oConsumer           : oTumblrConsumer,
        oToken              : oTumblrAccessToken
    );

    //signed url
    signedURL = oTumblrReqest.getString();
</cfscript>

<cfhttp method="get" url="#signedURL#" result="requestResult" charset="utf-8" redirect="no" />

<cfdump var="#requestResult#">

您可以查看 OAuth 库存档中的其他示例。

希望这会有所帮助。

【讨论】:

  • 感谢 Lucas 的信息:最终我将在 Tumblr 上发布多个博客,但为了简化流程并排除任何无关的问题,我选择尝试访问最简单的 oauth 控制数据有:api.tumblr.com/v2/user/info。我已成功获得 oauth_token(然后我将其存储在数据库中)。我只是无法让 API 接受我的请求,因为它没有给我任何反馈,所以我不知道缺少什么/错误。我已经通过基本字符串与网络上的其他示例进行了比较,我也比较了我的整个授权标头。拿不到:(
  • 您将哪个令牌存储在数据库中?在 OAuth 流程中,您收到两种类型的令牌:请求令牌和访问令牌。后者是您应该用来使用 API 访问任何数据的那个。如果您在此处粘贴的代码用于获取用户信息,那么为什么 Auth 标头中没有签名以及 oauth_nonce 和 oauth_verifier 在那里做什么?在我看来,您仍然没有阅读 OAuth 流程的工作原理。
  • 好的 - 我将发布我所拥有的所有内容,包括:实际访问信息(我知道这是不可以的,但我打算擦除那里的内容并重新开始 - 加上博客根本没有上市)。
  • 很抱歉延迟获取更多信息(工作妨碍了工作)。我希望今天 EOD 可以提供更多代码等。
  • 卢卡斯,感谢您给我的帮助。我想知道您是否可以就我对问题的编辑(日期为 1/27/13)给我一些反馈?我觉得我仍然在黑暗中工作。我知道我正确地获得了 auth_token 和 auth_token_secret,但除此之外,我还在碰壁。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-04-09
  • 1970-01-01
  • 1970-01-01
  • 2013-12-08
  • 2011-03-15
  • 1970-01-01
  • 2011-12-08
相关资源
最近更新 更多