gpt4 book ai didi

python - 使用 rauth 来自 fatsecret API 的签名无效

转载 作者:太空宇宙 更新时间:2023-11-03 18:37:50 25 4
gpt4 key购买 nike

我已成功按照 rauth OAuth1 示例获取访问 token ,从而从 fatsecret API 检索数据。我将 access_token 和 access_token_secret 存储在搁置数据库中。我的问题是,当我稍后尝试使用存储的 token 检索更多数据时,收到“无效签名”错误。

这是我获取 token 并检索 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 并打开一个新 session ,但我被告知我的签名无效。

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 参数似乎没有按字典顺序排序,但我不知道这是否准确反射(reflect)了发送到 fatsecret 的内容,无论如何它在第一个脚本中运行良好.

我尝试过类似的东西 using OAuth1Session而不是 OAuth1Service,但我收到了完全相同的结果。

如果您能提供任何帮助以使其正常工作,我将不胜感激。

最佳答案

我检查了这段代码无数次,没有发现任何错误。当我添加额外的打印以进行调试时,我注意到我在重用 session 的第 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']

所以上面的代码实际上是使用 python 使用 fatsecret api 进行身份验证的一个很好的演示。

关于python - 使用 rauth 来自 fatsecret API 的签名无效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21199847/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com