【问题标题】:Oauth authentification to Fitbit using httr使用 httr 对 Fitbit 进行 Oauth 身份验证
【发布时间】:2023-03-12 07:45:01
【问题描述】:

我正在尝试使用httr library 连接到 fitbit api。

使用提供的示例,我想出了以下代码:

library(httr)

key <- '<edited>'
secret <- '<edited>'
tokenURL <- 'http://api.fitbit.com/oauth/request_token'
accessTokenURL <- 'http://api.fitbit.com/oauth/access_token'
authorizeURL <- 'https://www.fitbit.com/oauth/authorize'

fbr <- oauth_app('fitbitR',key,secret)
fitbit <- oauth_endpoint(tokenURL,authorizeURL,accessTokenURL)

token <- oauth1.0_token(fitbit,fbr)
sig <- sign_oauth1.0(fbr,
    token=token$oauth_token,
    token_secret=token$oauth_token_secret
)

我从 httr 获得 身份验证完成。 消息,但尝试访问 api 然后抛出错误消息

GET("http://api.fitbit.com/1/user/-/activities/date/2012-08-29.json", sig)
Response [http://api.fitbit.com/1/user/-/activities/date/2012-08-29.json]
  Status: 401
  Content-type: application/x-www-form-urlencoded;charset=UTF-8
{"errors":[{"errorType":"oauth","fieldName":"oauth_access_token","message":"Invalid signature or token '<edited>' or token '<edited>'"}]} 

关于问题可能是什么的任何线索?

【问题讨论】:

    标签: r oauth fitbit httr


    【解决方案1】:

    我唯一注意到的是,您获取签名的调用与 httr 示例略有不同。 httr 示例是:

    sig <- sign_oauth1.0(myapp, token$oauth_token, token$oauth_token_secret)
    

    虽然您的代码是:

    sig <- sign_oauth1.0(fbr,
        token=token$oauth_token,
        token_secret=token$oauth_token_secret
    )
    

    您的代码中是否需要“token=”和“token_secret=”?

    【讨论】:

    • 只是为了它而尝试过,但没有任何区别:无论如何,使用命名参数应该没有区别吗?不过谢谢你的建议!
    • 你能发布包含标题的详细请求吗?
    • 这里是 http 标头:OAuth oauth%5Fconsumer%5Fkey=\"\", oauth%5Fnonce=\"ImkQ6g3HO0\", oauth%5Fsignature=\"\" , oauth%5Fsignature%5Fmethod=\"HMAC%2DSHA1\", oauth%5Ftimestamp=\"1346655744\", oauth%5Ftoken=\"\", oauth%5Fversion=\"1%2E0\" 这样做帮忙?
    • 我忘了提到我坐在代理后面:虽然我在另一台计算机上尝试过并且遇到了同样的问题,但这可能是原因吗?
    • 环顾四周后发现问题出在 oauth_signature (正如 API 确实报告的那样) - 请参阅下面的答案
    【解决方案2】:

    问题来自 httr 库,它使用 curlEscape 对参数进行编码,而 OAuth 1.0 规范需要百分比编码(请参阅this page)。

    用 curlPercentEncode 替换对 curlEscape 的调用可以解决问题!

    非常感谢@mark-s 的帮助。

    【讨论】:

    • 您能否通过给出一个示例代码来扩展答案,说明如何“用 curlPercentEncode 替换对 curlEscape 的调用”?
    • 您愿意解释一下这是什么意思吗? (虽然我不确定这是否仍然相关,因为 httr 的实施似乎已经改变)。
    猜你喜欢
    • 2016-03-28
    • 2022-09-23
    • 2021-11-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-20
    • 2014-11-23
    • 1970-01-01
    相关资源
    最近更新 更多