Ich versuche mich von einer Website abzumelden, die ich mit integriertem Facebook erstellt habe. Die Anmeldung funktioniert einwandfrei, aber wenn ich mich von Firebug abmelden möchte, erhalte ich immer den folgenden Fehler:
FB.logout()
ohne Zugriffstoken aufgerufen.
Ich verwende das Facebook JavaScript SDK und der Code, den ich zum Abmelden habe, sieht folgendermaßen aus:
$(document).ready($(function () {
$("#fblogout").click(facebooklogout);
}));
function facebooklogout() {
FB.logout(function (response) {
}
)};
Dies ist der Abmeldecode, der in der Facebook Developers Documentation angegeben ist, wobei einem Button die Methode für document.ready zugewiesen wurde
Vor diesem Code habe ich die FB.init()
-Methode, die alles gut läuft.
Wenn jemand eine Lösung dafür findet, warum FB.logout kein Zugriffstoken hat, ist dies sehr zu begrüßen.
Um sich von der Anwendung abzumelden, die die Facebook-Grafik-API verwendet, verwenden Sie dieses JavaScript auf der Abmeldeseite direkt nach dem <form>
Etikett:
window.onload=function()
{
// initialize the library with your Facebook API key
FB.init({ apiKey: 'b65c1efa72f570xxxxxxxxxxxxxxxxx' });
//Fetch the status so that we can log out.
//You must have the login status before you can logout,
//and if you authenticated via oAuth (server side), this is necessary.
//If you logged in via the JavaScript SDK, you can simply call FB.logout()
//once the login status is fetched, call handleSessionResponse
FB.getLoginStatus(handleSessionResponse);
}
//handle a session response from any of the auth related calls
function handleSessionResponse(response) {
//if we dont have a session (which means the user has been logged out, redirect the user)
if (!response.session) {
window.location = "/mysite/Login.aspx";
return;
}
//if we do have a non-null response.session, call FB.logout(),
//the JS method will log the user out of Facebook and remove any authorization cookies
FB.logout(handleSessionResponse);
}
Der Code funktioniert und ist live auf meiner Seite.
Ich entschied mich für die weniger triviale Lösung:
function facebookLogout(){
FB.getLoginStatus(function(response) {
if (response.status === 'connected') {
FB.logout(function(response) {
// this part just clears the $_SESSION var
// replace with your own code
$.post("/logout").done(function() {
$('#status').html('<p>Logged out.</p>');
});
});
}
});
}
Ich habe so etwas ausprobiert:
function fbLogout(){
if(typeof FB.logout == 'function'){
if (FB.getAuthResponse()) {
FB.logout(function(response) { window.location.href = PROJECT_PATH + '/index/logout'; });
return;
}
};
window.location.href = PROJECT_PATH + '/index/logout';
return;
}
Sollte etwas ähnlicher sein. Es wurde eine Änderung an der JS-API vorgenommen, bei der Sie authResponse anstelle von nur session verwenden müssen.
//handle a session response from any of the auth related calls
function handleSessionResponse(response) {
//if we dont have a session (which means the user has been logged out, redirect the user)
if (!response.authResponse) {
return;
}
//if we do have a non-null response.session, call FB.logout(),
//the JS method will log the user out of Facebook and remove any authorization cookies
FB.logout(response.authResponse);
}
Der Fehler besagt, dass Sie kein Zugriffstoken haben. Sie müssen mit der Funktion FB.getAccessToken () nach einem Token suchen.
Wenn kein Zugriffstoken vorhanden ist, gibt die Funktion null zurück. Siehe folgendes Beispiel:
function facebooklogout() {
try {
if (FB.getAccessToken() != null) {
FB.logout(function(response) {
// user is now logged out from facebook do your post request or just redirect
window.location.replace(href);
});
} else {
// user is not logged in with facebook, maybe with something else
window.location.replace(href);
}
} catch (err) {
// any errors just logout
window.location.replace(href);
}
}
Hat es nach so vielen Versuchen herausgefunden. Tatsächlich übergeben wir response
an FB.logout.
Allgemein response.authResponse.accessToken
enthält Token. Es ist also ein Fehler, dass das accessToken nicht vorhanden ist.
Überlegen Sie logisch, woher diese Antwort in Ihrem Code kommt. Aus dem Nichts.
Also müssen wir dieses Antwortobjekt von einer Funktion abrufen und an die Abmeldefunktion übergeben. Ich weiß nicht, wie es bei anderen funktioniert hat, aber das hat bei mir funktioniert.
Ersetzen Sie einfach den Code durch diesen
function logout(){
FB.getLoginStatus(function(response) {
FB.logout(function(response){
console.log("Logged Out!");
window.location = "/";
});
});
}
Was wir hier tun, ist, den Anmeldestatus zu erhalten, wenn der Benutzer angemeldet ist, und im Gegenzug die entsprechende Antwort zu erhalten, die alle erforderlichen Token und Daten enthält. Und dann übergeben wir diese Antwort an die Abmeldefunktion.