首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用rauth的fatsecret的无效签名

使用rauth的fatsecret的无效签名
EN

Stack Overflow用户
提问于 2014-01-18 04:02:57
回答 1查看 660关注 0票数 1

我已经成功地遵循了rauth OAuth1示例来获取我的访问令牌,从而从API秘密API中检索数据。我将access_token和access_token_secret存储在搁置数据库中。我的问题是,在以后尝试使用存储的令牌检索更多数据时,我会收到一个“无效签名”错误。

下面是我获取令牌并检索exercise_entries.get方法的原始脚本:

代码语言:javascript
复制
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并打开一个新的会话,但是我被告知我有一个无效的签名。

代码语言:javascript
复制
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如下:

代码语言:javascript
复制
{ "error": {"code": 8, "message": "Invalid signature: oauth_signature 'ccZpSYAPSn+umkTxcAVH7EChVvw='" }}

r.url是:

代码语言:javascript
复制
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参数似乎没有从图形上进行排序,但我不知道这是否准确地反映了发送给fatsecret的内容,而且无论如何,它在第一个脚本中运行得很好。

我尝试过类似的使用OAuth1Session,而不是OAuth1Service,但是我得到了完全相同的结果。

如果能帮上忙我会很感激的。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-01-28 02:08:01

我检查了这个代码无数次,没有发现任何错误。当我添加额外的打印以进行调试时,我注意到我在重用会话的第6行检索了两次access_token。毕竟这只是个错误。

更改:

代码语言:javascript
复制
fs_access_token = shelf['fatsecret_access_token']
fs_access_token_secret = shelf['fatsecret_access_token']

至:

代码语言:javascript
复制
fs_access_token = shelf['fatsecret_access_token']
fs_access_token_secret = shelf['fatsecret_access_token_secret']

因此,上面的代码实际上是使用python验证fatsecret的一个很好的演示。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21199847

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档