2012-08-31 21 views
5

Estoy tratando de conectarme a la api de Fitbit usando el httr library.Autenticación de Oauth a Fitbit usando httr

Utilizando los ejemplos proporcionados, se me ocurrió con el siguiente código:

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 
) 

tengo la autenticación completa. mensaje del HTTR, pero tratando de acceder a la API a continuación, lanza un mensaje de error

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

Cualquier idea de lo que podría ser el problema?

Respuesta

4

El problema proviene de la biblioteca httr, que usa curlEscape para codificar parámetros, mientras que las especificaciones OAuth 1.0 requieren la codificación porcentual (consulte this page).

Reemplazar las llamadas a curlEscape con curlPercentEncode resuelve el problema.

muchas gracias a @ mark-s por su ayuda.

+1

¿Podría ampliar la respuesta dando un código de ejemplo de cómo "reemplazar la llamada a curlEscape con curlPercentEncode "¿?" –

+0

¿Le importaría explicar lo que esto significa? (Aunque no estoy seguro de si eso sigue siendo relevante ya que la implementación de 'httr' parece haber cambiado). –

2

Lo único que noto es que su llamada para obtener la firma es ligeramente diferente de los ejemplos de httr. Los ejemplos son HTTR:

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

Mientras que el código es:

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

quiere el "token =" y "token_secret =" en el código?

+0

Acabo de intentar por el bien, pero no hizo ninguna diferencia: de todos modos, el uso de argumentos con nombre no debería hacer una diferencia? ¡Pero gracias por tu sugerencia! –

+0

¿Se puede publicar la solicitud detallada con los encabezados incluidos? –

+0

Aquí está el encabezado http: OAuth oauth% 5Fconsumer% 5Fkey = \ " \", oauth% 5Fnonce = \ "ImkQ6g3HO0 \", oauth% 5Fsignature = \ " \", oauth% 5Fsignature% 5Fmethod = \ "HMAC% 2DSHA1 \ ", oauth% 5Ftimestamp = \" 1346655744 \ ", oauth% 5Ftoken = \" \ ", oauth% 5Fversion = \" 1% 2E0 \ "¿Esto ayuda? –

Cuestiones relacionadas