2013-09-27 80 views
1

對不起,如果這是一個noob問題,但我試圖測試並開始與Vimeo的API一起使用RAuth python庫。OAuth簽名無效錯誤使用Rauth,Python對Vimeo API

我在開發者網站上向Vimeo註冊的應用程序的應用程序頁面上使用了訪問令牌/密碼。所以我猜這個問題的第一部分是:是否有效的訪問令牌/祕密,還是需要實際經歷OAuth流程,儘管我嘗試使用此API訪問我公司的帳戶?

假設這是一個有效的令牌,那麼問題的肉,因爲此實現:

from rauth.session import OAuth1Session 

session = OAuth1Session(
        consumer_key=VIMEO_CLIENTID, 
        consumer_secret=VIMEO_CLIENTSECRET, 
        access_token=VIMEO_ACCESSTOKEN, 
        access_token_secret=VIMEO_ACCESSTOKENSECRET) 

response = session.get(VIMEO_URL_BASE + 'vimeo.oauth.checkAccessToken') 

我得到的迴應如下:基於OAuth的頭

{"response": {"err": {"expl": "The oauth_signature passed was not valid.", "code": "401", "msg": "Invalid signature"}, "stat": "fail", "generated_in": "0.0041"} 

看起來像這樣(注意,我剛剛從會話對象中提取了這些內容,因此這些鍵不是內部使用的,並且是由Rauth庫定義的那些鍵):

{ 
"signature": "DH9ueZmrnguFgBIDZs7ZQPE7qHs=", 
"nonce": "8bcbc130548c0677cd134e7d7f22b17df7a2eee6", 
"timestamp": 1380266167, 
"oauth_version": "1.0", 
"token": VIMEO_ACCESSTOKENSECRET, 
"consumer_key": VIMEO_CLIENTID, 
"sig_method": "HMAC-SHA1" 
} 

我讀過一些關於時鐘關閉的文章。我的開發工作站檢查time.windows.com,儘管我確實用time-a.nist.gov將其切換出來以防萬一。我也關閉了同步並手動移動了我的時鐘幾秒鐘。沒有一個效果。我也嘗試過檢查developer.vimeo.com網站的操場示例中的時間戳與我的時鐘,他們最多隻能在1-2秒之內。

我想我在做一些沒有意義的事情,儘管假設第一個問題的答案是正確的,並且根據我在RAuth代碼中讀到的內容,如果我擁有有效的身份驗證令牌和密碼,我應該可以使用那些無需經歷整個OAuth流程,因爲無論如何這隻會產生新的令牌/祕密。

再一次,我是OAuth的新手,我對Python比較陌生,所以我可能會做一些愚蠢的事情。

回答

2

這裏的問題是,您正在嘗試獲取整個URL,並且不允許Rauth通過請求API來簽署參數。這不起作用,因爲Rauth需要能夠查看參數並以特定方式進行簽名。相反,你應該這樣做:

print sess.get('http://vimeo.com/api/rest/v2', params={'method': 'vimeo.oauth.checkAccessToken'}).content 

<?xml version="1.0" encoding="UTF-8"?>\n<rsp generated_in="0.0044" stat="ok">\n <oauth>\n <token>...</token>\n <permission>delete</permission>\n <user display_name="Max Countryman" id="16760357" username="user16760357"/>\n </oauth>\n</rsp>\n' 

記住Rauth是請求,但是添加的方便OAuth的處理。這意味着你應該像使用請求一樣使用Rauth。

下應該工作(我個人和我的Vimeo憑據測試,它似乎工作如預期):

from rauth.session import OAuth1Session 

session = OAuth1Session(consumer_key=VIMEO_CLIENTID, 
         consumer_secret=VIMEO_CLIENTSECRET, 
         access_token=VIMEO_ACCESSTOKEN, 
         access_token_secret=VIMEO_ACCESSTOKENSECRET) 

response = session.get('http://vimeo.com/api/rest/v2', params={'method': 'vimeo.oauth.checkAccessToken'}) 

希望幫助!

+1

我明白了。我沒有意識到這一點。我會去看看它是否能修正它。你的庫比requested_oauthlib精簡得多。我在Google App Engine上運行,因此我可以在那裏加載的越少越好。 :) – KenLFG

+0

因此,顯然,這可以與OAuth 1 API協同工作,只要您按照上述maxcountryman的說法操作即可。這是什麼東西,只是沒有記錄或我有點想念它? – KenLFG