2012-08-31 8 views
5

Sto provando a connettermi all'API fitbit utilizzando httr library.Autenticazione Oauth su Fitbit tramite httr

Utilizzando gli esempi forniti, mi si avvicinò con il seguente codice:

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 
) 

ho la autenticazione completa. messaggio da HTTR, ma cercando di accedere alle API quindi genera un messaggio di errore

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

Qualsiasi indizio su ciò che il problema potrebbe essere?

risposta

4

Il problema deriva dalla libreria httr, che utilizza curlEscape per la codifica dei parametri mentre le specifiche di OAuth 1.0 richiedono la codifica percentuale (vedere this page).

Sostituire le chiamate a curlEscape con curlPercentEncode risolve il problema!

molte grazie a @ mark-s per il suo aiuto.

+1

Potresti espandere la risposta fornendo un codice di esempio su come "sostituire la chiamata a curlEscape con curlPercentEncode "? –

+0

Ti piacerebbe spiegare cosa significa? (Anche se non sono sicuro che sia ancora rilevante dal momento che l'implementazione di 'httr' sembra essere cambiata). –

2

L'unica cosa che noto è che la tua chiamata per ottenere la firma è leggermente diversa rispetto agli esempi di httr. Gli esempi sono HTTR:

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

Mentre il codice è:

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

Avete bisogno del "gettone =" e "token_secret =" nel codice?

+0

Provato solo per il gusto di farlo, ma non ha fatto alcuna differenza: in ogni caso, l'utilizzo di argomenti con nome non dovrebbe fare la differenza? Ma grazie per il tuo suggerimento! –

+0

Puoi pubblicare la richiesta dettagliata con le intestazioni incluse? –

+0

Ecco l'intestazione http: OAuth oauth% 5Fconsumer% 5Fkey = \ " \", oauth% 5Fnonce = \ "ImkQ6g3HO0 \", oauth% 5Fsignature = \ " \", oauth% 5Fsignature% 5Fmethod = \ "HMAC% 2DSHA1 \ ", oauth% 5Ftimestamp = \" 1346655744 \ ", oauth% 5Ftoken = \" \ ", oauth% 5Fversion = \" 1% 2E0 \ "aiuta? –