Mit Facebook Graph API mit dem JS-SDK in einer canvas-Seite, iFrame in Safari kaputt ist
So, ich bin versucht, die Graph API mit dem Facebook JS SDK, und ich bin immer die folgende Fehlermeldung in Safari:
"OAuthException: Eine active access token muss verwendet werden, zur Abfrage von Informationen über den aktuellen Benutzer."
Ich vermutete, es hatte mit der Tatsache zu tun, dass Safari ist sehr streng mit x-cookie-domain-Einstellung und so versuchte ich es in Firefox mit cookie
option auf false gesetzt in FB.init()
. Ich habe in der Tat festgestellt, dass ich immer den gleichen Fehler für meine FB.api()
Anfragen.
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'
});
So Frage ich mich... ist es ein guter Weg, um manuell die access_token
query-parameter in der FB.api()
Anfrage?
Wenn die FB.init()
cookie wird richtig gesetzt, das ist, was die FB.api()
request-Parameter wie folgt Aussehen:
access_token xxxxxxxxxxxx|1.xxxxxxxxxxxxxxxxxxxxxx__.3600.xxxxxxxxxx-xxx|xxxxxxxxxxxxxxxxxxxxxxxxxxx
callback FB.ApiServer._callbacks.xxxxxxxxxxxxxxx
pretty 0
sdk joey
In Safari (oder, wenn die cookie
FB.init()
option ist nicht gesetzt) die FB.api()
request-Parameter wie folgt Aussehen:
callback FB.ApiServer._callbacks.xxxxxxxxxxxxxxx
pretty 0
sdk joey
Nun... natürlich wird meine app hat die Fähigkeit, erzeugen die access_token
auf der server-Seite... ich Frage mich, ob es irgendeinen Weg kann ich manuell einstellen FB.api()
um meine server-Seite generiert access_token
.
- Ich denke es ist ein weiterer Weg, dies zu tun. Im Grunde, da haben wir mal zufällig auf das setzen von cookies auf die ursprüngliche post-Anforderung, füllt das iFrame, können wir die Gelegenheit nutzen, um imitieren die
fbs_xxxxxxxxx
cookie, dass die FB-JS-SDK versucht, währendFB.init()
. Nun... der cookie-Wert, dass die SDK-sets sieht wie folgt aus:fbs_xxxxxxxxx="access_token=xxx&expires=xxx&secret=xxx&session_key=xxx&sig=xxx&uid=xxx"
. Dieaccess_token
undexpires
Teile sind sehr einfach. Aber ich bin mit ein wenig Mühe, herauszufinden, die anderen Teile.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ok, ich habe es zu arbeiten. Ich stellt sich heraus, Sie brauchen nicht die
FB.init()
cookie: true
option, um zu verwendenFB.api()
--Sie können manuell übergeben Sie den access_token:Wo
access_token
ist eine JS-variable, Sie setzen server-Seite auf Seite zu laden. Hier ist eine ERB Beispiel:Sowie
@access_token
ist der oauth-access_token, die übergeben bekommt, um Ihre Leinwand Seite in den ersten POST-Anfrage.Die Einschränkung mit Safari ist, dass es nicht zulassen, dass der Inhalt in einem iframe zu erstellen oder zu verwenden cookies, wenn die domain ist unterschiedlich zu den Eltern... es sei denn, der Benutzer interagiert mit es zuerst. Das problem ist eindeutig auf Safari nicht webkit, also Chrome ist in Ordnung.
Nach laufen in dieses problem selbst (mehrere schmerzhafte Zeiten), es ist eine Lösung, die scheint zu sein, eine gute Arbeit um. Die Technik ist das injizieren einer form in die Seite Körper mit javascript und dann auslösen des submit-Ereignis. Safari akzeptiert dies als user-Interaktion und cookies zulässt.
Finden Sie ein gutes Beispiel auf der Facebook developer forum hier
FB.api()
-- also keine Notwendigkeit für die browser-spezifischen Regeln.