5

Così sto cercando di utilizzare l'API Grafico con la Facebook JS SDK e sto ottenendo il seguente errore in Safari:Utilizzando API di Facebook Grafico con il JS SDK in una pagina di tela iFrame in Safari è rotto

"OAuthException: è necessario utilizzare un token di accesso attivo per richiedere informazioni sull'utente corrente."

Avevo il sospetto che fosse dovuto al fatto che Safari è molto rigido con l'impostazione dei cookie x-domain e così l'ho provato in Firefox con l'opzione cookie impostata su false in FB.init(). Ho infatti trovato che stavo ottenendo lo stesso errore per le mie richieste FB.api().

FB.init({ 
    appId: "<%= app_id %>", 
    status: true, // check login status 
    // We cannot rely on this cookie being set in an iframe. I found this 
    // out because the Graph API was not working in Safari. 
    // cookie: true, // enable cookies to allow the server to access the session 
    xfbml: true, // parse XFBML 
    channelUrl: window.location.protocol + '//' + window.location.host + '/fb/canvas/channel.html' 
}); 

Quindi mi chiedo ... c'è un buon modo per impostare manualmente i parametri di query access_token nella richiesta FB.api()?

Se il cookie FB.init() viene impostato correttamente, questo è ciò che i FB.api() parametri della richiesta assomigliano:

access_token xxxxxxxxxxxx|1.xxxxxxxxxxxxxxxxxxxxxx__.3600.xxxxxxxxxx-xxx|xxxxxxxxxxxxxxxxxxxxxxxxxxx 
callback  FB.ApiServer._callbacks.xxxxxxxxxxxxxxx 
pretty  0 
sdk   joey 

In Safari (o quando l'opzione cookieFB.init() non è impostata) il FB.api() richiesta di parametri assomigliano:

callback  FB.ApiServer._callbacks.xxxxxxxxxxxxxxx 
pretty  0 
sdk   joey 

Ora ... ovviamente la mia app ha la capacità di generare il access_token sul lato server ... Mi chiedo se c'è un modo in cui posso impostare manualmente FB.api() per utilizzare il mio server-side generato access_token.

+0

Sto pensando che c'è un altro modo per farlo. Fondamentalmente, dato che abbiamo una volta la possibilità di impostare i cookie sulla richiesta iniziale che popola l'iFrame, possiamo usare l'opportunità di imitare il cookie 'fbs_xxxxxxxxx' che l'SDK FB JS tenta di impostare durante' FB.init() '. Ora ... il valore del cookie impostato da SDK è il seguente: 'fbs_xxxxxxxxx =" access_token = xxx & expires = xxx & secret = xxx & session_key = xxx & sig = xxx & uid = xxx "'. Le parti 'access_token' e' expires' sono facili.Ma sto avendo un piccolo problema a capire le altre parti. –

risposta

4

Ok ho preso a lavorare. Ho scopre che non è necessario l'opzione FB.init()cookie: true al fine di utilizzare FB.api() --potete passare manualmente l'access_token:

FB.api("/me/apprequests/?access_token="+access_token, function (response) {}); 

Dove access_token è una variabile JS che si imposta sul lato server al caricamento della pagina. Ecco un esempio ERB:

<script> 
    var access_token = "<%= @access_token %>"; 
</script> 

E @access_token è l'access_token OAuth che viene passato alla pagina di tela nella richiesta POST iniziale.

3

La limitazione con Safari è che non consente ai contenuti di un iframe di creare o utilizzare i cookie se il dominio è diverso dal genitore ... a meno che l'utente non interagisca con esso per primo. Il problema è esclusivo di Safari non webkit, quindi Chrome va bene.

Dopo aver incontrato personalmente questo problema (diverse volte dolorose), c'è una soluzione che sembra essere un buon lavoro. La tecnica consiste nell'iniettare un modulo nel corpo della pagina utilizzando javascript e quindi attivare l'evento di invio. Safari accetta questo come interazione dell'utente e consente i cookie.

è possibile trovare un buon esempio sul forum degli sviluppatori di Facebook here

+0

Ah, non è una cattiva idea. So che il modulo inviato da JS invia è come Facebook consente alle pagine tela di iFrame di impostare i cookie per il dominio dell'iFrame anche su browser come Safari che in genere non impostano cookie sulle richieste iFrame x-domain (http://stackoverflow.com)/domande/4701922/come se-facebook-set-cross-domain-cookies-per-iframe-on-canvas-pagine). Tuttavia, sembra che l'attivazione di un evento di invio del modulo dall'iFrame (o il caricamento di JS) non sia la migliore esperienza utente. Inoltre, il team di Safari potrebbe vederlo come un buco di sicurezza che aggira la difesa contro gli annunci che tracciano gli utenti. –

+0

È possibile mascherarne la maggior parte dall'utente. Ho utilizzato un'implementazione che verifica il lato server dell'agente utente nella pagina di destinazione e quindi fornisce HTML per fare il trucco dei form per gli utenti di Safari. La transizione è quasi veloce come il reindirizzamento con un'intestazione di posizione. – leebriggs

+0

Interessante. Bene, lo terrò sicuramente a mente. Per ora mi sono reso conto che in realtà non è necessario che l'FB JS SDK imposti un cookie per usare 'FB.api()' - quindi non c'è bisogno di regole specifiche per il browser. –