2014-01-18 79 views
1

我已成功地遵循了rauth OAuth1示例來獲取我的訪問令牌,因此檢索fatsecret API中的數據。我將我的access_token和access_token_secret存儲在擱置數據庫中。我的問題是,當我嘗試使用存儲的令牌以稍後檢索更多數據時,我收到「無效簽名」錯誤。使用rauth從fatsecret API發出的無效簽名

這是我原來的劇本獲得令牌和檢索exercise_entries.get方法:

from rauth.service import OAuth1Service 
import shelve 

api_url = 'http://platform.fatsecret.com/rest/server.api' 
shelf = shelve.open('token_shelf.db') 

fatsecret = OAuth1Service(
    consumer_key = 'xxxxxxxxxxxxx', 
    consumer_secret = 'xxxxxxxxxxxxx', 
    name = 'fatsecret', 
    request_token_url = 'http://www.fatsecret.com/oauth/request_token', 
    access_token_url = 'http://www.fatsecret.com/oauth/access_token', 
    authorize_url = 'http://www.fatsecret.com/oauth/authorize') 

request_token, request_token_secret = fatsecret.get_request_token(
         method = 'GET', 
         params = {'oauth_callback':'oob'}) 

authorize_url = fatsecret.get_authorize_url(request_token) 

print 'Visit this URL in your browser: ' + authorize_url 
pin = raw_input('Enter PIN from browser: ') 
shelf['fatsecret_request_token'] = request_token 
shelf['fatsecret_request_token_secret'] = request_token_secret 
shelf['fatsecret_pin'] = pin 

session = fatsecret.get_auth_session(
            request_token, 
            request_token_secret, 
            params={'oauth_verifier': pin} 
            ) 
shelf['fatsecret_access_token'] = session.access_token 
shelf['fatsecret_access_token_secret'] = session.access_token_secret 

my_params = {'method': 'exercise_entries.get', 'format': 'json'} 
r = session.get(api_url, params=my_params) 

print r.json() 
print r.content 
shelf.close() 

然後我嘗試從貨架恢復我的access_token和access_token_secret並打開一個新的會話,但我告訴我有一個簽名無效。

from rauth.service import OAuth1Service 
import shelve 
api_url = 'http://platform.fatsecret.com/rest/server.api' 
shelf = shelve.open('token_shelf.db') 
fs_access_token = shelf['fatsecret_access_token'] 
fs_access_token_secret = shelf['fatsecret_access_token'] 

fatsecret = OAuth1Service(
    consumer_key = 'xxxxxxxxxxxxx', 
    consumer_secret = 'xxxxxxxxxxxxx', 
    name = 'fatsecret', 
    request_token_url = 'http://www.fatsecret.com/oauth/request_token', 
    access_token_url = 'http://www.fatsecret.com/oauth/access_token', 
    authorize_url = 'http://www.fatsecret.com/oauth/authorize') 

session = fatsecret.get_session((fs_access_token,fs_access_token_secret)) 

my_params = {'method': 'exercise_entries.get', 'format': 'json'} 
r = session.get(api_url,params=my_params) 
print r.content 
print r.url 
shelf.close() 

這將返回r.content爲:

{ "error": {"code": 8, "message": "Invalid signature: oauth_signature 'ccZpSYAPSn+umkTxcAVH7EChVvw='" }} 

r.url是:

http://platform.fatsecret.com/rest/server.api?oauth_nonce=604416f368159818e3ad8252a0da323be16319a3&format=json&oauth_consumer_key=xxxxxxxxxxxxx&oauth_timestamp=1390015877&oauth_signature_method=HMAC-SHA1&oauth_version=1.0&oauth_token=xxxxxxxxxxxxx&oauth_signature=l4Ricqpbbwl%2BHPS2ItLLnvXQo%2FA%3D&method=exercise_entries.get 

那映入我眼簾的是,r.url參數似乎沒有被lexigraphically唯一排序,但我不知道這是否準確地反映了發送給fatsecret的內容,無論如何,它在第一個腳本中運行良好。

我試過類似的東西using OAuth1Session而不是OAuth1Service,但我收到完全相同的結果。

我很感激任何幫助,讓這項工作。

回答

0

我檢查了這個代碼無數次,找不到任何錯誤。正如我在額外的打印調試中添加的,我注意到我在重用會話的第6行檢索了兩次access_token。畢竟這只是一個錯字。

變化:

fs_access_token = shelf['fatsecret_access_token'] 
fs_access_token_secret = shelf['fatsecret_access_token'] 

要:

fs_access_token = shelf['fatsecret_access_token'] 
fs_access_token_secret = shelf['fatsecret_access_token_secret'] 

所以上面的代碼實際上是與蟒蛇但是FatSecret API認證的一個很好的示範。