Oauth-аутентификация в Fitbit с использованием httr

Я пытаюсь подключиться к API FitBit с помощью библиотеки httr.

Используя предоставленные примеры, я придумал следующий код:

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>'"}]} 

Любая подсказка о том, что проблема может быть?

2 ответа

Решение

Проблема возникает из библиотеки httr, которая использует curlEscape для кодирования параметров, в то время как спецификации OAuth 1.0 требуют кодирования в процентах (см. Эту страницу).

Замена вызовов curlEscape на curlPercentEncode решает проблему!

большое спасибо @mark-s за помощь.

Единственное, что я замечаю, это то, что ваш призыв получить подпись немного отличается от примеров 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=" в вашем коде?

Другие вопросы по тегам