2013-01-17 8 views
7

mi rendo conto che non è una novità e che ci sono un sacco di post su questo argomento già. Tuttavia, non sono esattamente in relazione a quello che sto cercando ... SO, qui va:Coldfusion Tumblr oAuth Frustrazione

Ho rivisto OGNI altro post su questo argomento e nulla sembra funzionare per me. Ecco un breve riassunto di quello che sto facendo:

*** Sono stato così a lungo che sto perdendo traccia di dove sono- Mi sono appena reso conto che la mia oauth_signature non è presente nella mia intestazione di autorizzazione. So che c'era prima ...

BTW sto usando un'applicazione CF OAuth da Harry Klein (http://oauth.riaforge.org/):

<!--- set up the parameters ---> 
<cfset sConsumerKey = 'xxx'> <!--- Got these from Tumblr for my app ---> 
<cfset sConsumerSecret = 'xxx'> <!--- Got these from Tumblr for my app --->  
<cfset OAUTH_VERIFIER = 'xxx' /> <!--- Got these when doing oauth registration with tumblr for account ---> 
<cfset token = 'xxx' /> <!--- Got these when doing oauth registration with tumblr for account ---> 
<cfset tokenSecret = 'xxx' /> <!--- Got these when doing oauth registration with tumblr for account ---> 

<!--- set up the required objects including signature method---> 
<cfset oReqSigMethodSHA = CreateObject("component", "oauth.oauthsignaturemethod_hmac_sha1")> 
<cfset oToken = CreateObject("component", "oauth.oauthtoken").init(sKey = token, sSecret = tokenSecret)> 
<cfset oConsumer = CreateObject("component", "oauth.oauthconsumer").init(sKey = sConsumerKey, sSecret = sConsumerSecret)> 

<cfset oReq = CreateObject("component", "oauth.oauthrequest").fromConsumerAndToken(
    oConsumer = oConsumer, 
    oToken = oToken, 
    sHttpMethod = "GET", 
    sHttpURL = 'http://api.tumblr.com/v2/user/info')> <!--- For now, just trying to get the user info ---> 
    <!--- The ultimate goal is to post to differnent blog accounts on tumblr ---> 

<cfset oReq.setParameter('oauth_verifier',oauth_verifier) /> <!--- Had to manually add in oauth_verifier if it is even needed ---> 

<cfset oReq.signRequest(
    oSignatureMethod = oReqSigMethodSHA, 
    oConsumer = oConsumer, 
    oToken = oToken)> <!--- Sign the request ---> 

<cfhttp url="#oReq.GETNORMALIZEDHTTPURL()#" method="get"> 
    <cfhttpparam type="header" name="authorization" value="#oReq.TOHEADER()#" /> 
</cfhttp> 

<cfdump var="#cfhttp#" /> 

Ecco alcune delle linea di quello che ho ottenuto di nuovo (ho aggiunto interruzioni per renderlo più leggibile):

SIGNATUREBASESTRING: 
    GET& 
    http%3A%2F%2Fapi.tumblr.com%2Fv2%2Fuser%2Finfo& 
    oauth_consumer_key%3xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx%26 
    oauth_nonce%3D96A76129198ADF9B60874521D3FB718256B2D093%26 
    oauth_timestamp%3D1358463090%26 
    oauth_token%3Dxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx%26 
    oauth_verifier%3xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx%26 
    oauth_version%3D1.0 

AUTHORIZATION HEADER: 
    OAuth oauth_consumer_key="xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx", 
    oauth_timestamp="1358463090", 
    oauth_version="1.0", 
    oauth_nonce="96A76129198ADF9B60874521D3FB718256B2D093", 
    oauth_token="xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx", 
    oauth_verifier="xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" 

Ogni volta che provo a modificare qualcosa, non funziona mai. Ricevo sempre la risposta 401 Non Autorizzata da Tumblr senza alcuna spiegazione su cosa sto facendo male.

Sono stato a questo per giorni: si prega di aiutare

* Modifica 2013/01/24 **

1. Getting the access_token: 
    response from Tumblr to auth_token request (Success): 
    oauth_token=XXX& 
    oauth_token_secret=XXX& 
    oauth_callback_confirmed=true 

    2. Using access token to get user info: 
    sConsumerKey: 
    xxx 

    sConsumerSecret: 
    yyy 

    EndPoint: 
    http://api.tumblr.com/v2/user/info 

    COMMETHOD: 
    get 

    token: 
    XXX 

    tokenSecret: 
    XXX 

    Signature base string: 
    GET& 
    http%3A%2F%2Fapi.tumblr.com%2Fv2%2Fuser%2Finfo& 
    oauth_consumer_key%3Dxxx& 
    oauth_nonce%3DDED2857752C210C71D81DFD549B7B13113DCA50F& 
    oauth_signature_method%3DHMAC-SHA1& 
    oauth_timestamp%3D1358993908& 
    oauth_token%XXX& 
    oauth_version%3D1.0 

    Signature: 
    emffJ8+2QvExJzRH0fgDM8l3jDQ= 

    Authorization Header: 
    OAuth oauth_consumer_key="xxx"& 
    oauth_nonce="DED2857752C210C71D81DFD549B7B13113DCA50F"& 
    oauth_signature="emffJ8%2B2QvExJzRH0fgDM8l3jDQ%3D"& 
    oauth_signature_method="HMAC-SHA1"& 
    oauth_timestamp="1358993908"& 
    oauth_token="XXX"& 
    oauth_version="1.0" 

verificato che: 1. oauth_token è corretta. 2. oAuth Header è ordinato in ordine alfabetico. 3. La stringa di base della firma non contiene parametri perché non ce ne sono. 4. Il metodo è get. 5. OAuth Header contiene oauth_signature.

Alcune domande sono: 1. Sono presenti altre intestazioni che è necessario includere (non sono sicuro che CF lo aggiunga automaticamente) 2. Qualcuno può verificare la mia stringa di base della firma? 3. Vi sono problemi di maiuscole/minuscole nella stringa di base della firma? (O in qualsiasi altro)

EDIT- 1/27/2013 Può qualcuno si prega di confermare queste informazioni (sto usando valori reali, perché tutto sarà azzerato dopo tra cui l'applicazione stessa):

Given: 
1. Signature Base String: 

GET& 
http%3A%2F%2Fapi.tumblr.com%2Fv2%2Fuser%2Finfo& 
oauth_consumer_key%XXX%26 
oauth_nonce%3DOAUTH7DC9F837D60483B9D10389C9BB0AEAF9%26 
oauth_signature_method%3DHMAC-SHA1%26 
oauth_timestamp%3D1359320053%26 
oauth_token%XXX%26 
oauth_version%3D1.0 

2. Signing Key (consumer secret & auth_token_secret): 
XXX& 
XXX 

Is this signature correct? 

3. Signature: 
2n+xbj9gbOrADeaQ3nORKNhOTUg=  

Is this Authorization Header correct: 

4. Authorization header (FYI- there is a space after each comma- is that ok? 
And- is the encoding on the Signature ok?): 
(Also, I've tried this in alphabetical order and not- same result) 

OAuth oauth_signature="2n%2Bxbj9gbOrADeaQ3nORKNhOTUg%3D", 
oauth_token="XXX", 
oauth_consumer_key="XXX", 
oauth_nonce="OAUTH7DC9F837D60483B9D10389C9BB0AEAF9", 
oauth_signature_method="HMAC-SHA1", 
oauth_timestamp="1359320053", 
oauth_version="1.0" 

sto sperando che qualcuno può confermare che questo è corretto o meno. In quest'ultimo caso, lo modificherò un po 'e spero di ricontrollare. Grazie in anticipo tutto.

+0

Alain, il "materiale sensibile" che hai rimosso è ancora disponibile nella [cronologia revisioni] (http://stackoverflow.com/posts/14389806/revisions) - se questa informazione è veramente sensibile, devi richiedere nuovi dettagli da Tumblr. –

+0

Grazie a @PeterBoughton. Registrerò una nuova app con Tumblr ma non voglio pubblicizzare le vecchie informazioni. Non mi rendevo conto che c'era una cronologia delle revisioni: apprezzare le teste! –

risposta

1

Non ho usato le API di Tumblr in particolare, ma hanno alcune idee circa il tuo problema.

Lei non ha detto che cosa stai cercando di fare. Hai ricevuto il token di accesso con successo? O stai provando ad usare il token di richiesta per ottenere le informazioni dell'utente? - che non funzionerà.

oauth_verifier è necessaria solo in procinto di ottenere il token di accesso - non quando si utilizza la funzionalità API normale (come ottenere informazioni utente).

A me sembra che si stia tentando di utilizzare il token di richiesta per accedere alle informazioni utente e inoltre aggiungere inutilmente oauth_verifier all'URL. Probabilmente dovrai leggere sul flusso di OAuth 1.0a.

Spero che questo aiuti.

UPDATE:

Ecco un diagramma di come OAuth flusso 1.0a dovrebbe essere simile. enter image description here

The original diagram image here

UPDATE dopo UPDATE

Tu dici che stai utilizzando la libreria da qui http://oauth.riaforge.org/ ma io non lo vedo nel codice. Anche in questo caso - non ho usato le API di Tumblr in particolare, ma più semplice chiamata utilizzando la libreria di cui sopra mi piace questo:

<cfscript> 
    consumerKey = 'xxx'; 
    consumerSecret = 'yyy'; 
    accessToken = 'xxxyyy'; 
    accessSecret = 'yyyxxx'; 

    //consumber object 
    oauthConsumerCFC = CreateObject("component", "OAuth.oauthconsumer"); 
    oTumblrConsumer = oauthConsumerCFC.init(sKey = consumerKey, sSecret = consumerSecret); 

    //token object 
    oauthTokenCFC = CreateObject("component", "OAuth.oauthtoken"); 
    oTumblrAccessToken = oauthTokenCFC.init(sKey = accessToken, sSecret = accessSecret); 

    //request object 
    oauthRequestCFC = CreateObject("component", "OAuth.oauthrequest"); 
    oTumblrReqest = oauthRequestCFC.fromConsumerAndToken(
     oConsumer : oTumblrConsumer, 
     oToken  : oTumblrAccessToken, 
     sHttpMethod : "GET", 
     sHttpURL : "http://api.tumblr.com/v2/user/info" 
    ); 

    //signature method 
    oauthSigMethodSHA = CreateObject("component", "OAuth.oauthsignaturemethod_hmac_sha1") 

    //sign request 
    oTumblrReqest.signRequest(
     oSignatureMethod : oauthSigMethodSHA, 
     oConsumer   : oTumblrConsumer, 
     oToken    : oTumblrAccessToken 
    ); 

    //signed url 
    signedURL = oTumblrReqest.getString(); 
</cfscript> 

<cfhttp method="get" url="#signedURL#" result="requestResult" charset="utf-8" redirect="no" /> 

<cfdump var="#requestResult#"> 

Potete vedere altri esempi che si trovano nell'archivio libreria OAuth.

Spero che questo aiuti.

+0

Grazie per le informazioni Lucas: In definitiva pubblicherò su più blog su Tumblr, ma per semplificare il processo ed escludere eventuali problemi estranei, ho scelto di tentare di accedere ai più semplici dati controllati da oauth che c'erano: http: // api.tumblr.com/v2/user/info. Ho avuto successo nell'ottenere il oauth_token (che poi memorizzo in un db). Non riesco a far sì che l'API accetti la mia richiesta e poiché non mi dà alcun feedback NON HO IDEA cosa manca/è sbagliato. Ho confrontato la stringa base con altri campioni sul web, ho confrontato anche l'intera intestazione dell'autorizzazione. Non riesco a ottenerlo :( –

+0

Quale token hai esattamente archiviato nel DB? Nel flusso OAuth ci sono 2 tipi di token che stai ricevendo: token di richiesta e token di accesso, quest'ultimo è quello che dovresti usare per accedere qualsiasi dato che utilizza l'API Se il bit di codice che hai incollato qui è per ottenere informazioni utente, allora perché non c'è firma nell'intestazione Auth e cosa stanno facendo oauth_nonce e oauth_verifier? Ancora mi sembra che tu non abbia letto come OAuth flow works – Lucas

+0

Ok- inserirò tutto ciò che ho incluso: informazioni sull'accesso effettivo (so che questo è un no no, ma sto pianificando di cancellare ciò che è lì e ricominciare da capo comunque, più il blog non ha –