517 Stimmen

Facebook Callback fügt '#_=_' an die Rückgabe-URL an

Facebook-Callback hat mit dem Anhängen von #_=_ Rautenunterstrich in der Rückgabe-URL

Weiß jemand, warum? Was ist die Lösung?

0 Stimmen

Ich stehe auch vor dem gleichen Problem: stackoverflow.com/q/7190184/912011 Ich denke jedoch, dass es mit der Firefox-Version zusammenhängen könnte.

0 Stimmen

Hat jemand eine Lösung für dieses Problem gefunden? Die Standard-Facebook-Connect-Sdk funktioniert nicht.

0 Stimmen

Das Beste, was wir tun können, bis Facebook diesen Fehler korrigiert (oder ihre Dokumentation) ist in meiner Antwort unten. Erstens, richten Sie Ihre Login-URLs in Übereinstimmung mit der Dokumentation ein. Und zweitens, fügen Sie eine schnelle Header-Javascript-Hack, um dies in Ihrem Code zu vermeiden. Dies wird gut abnehmen, wenn Facebook jemals dieses Problem behebt.

246voto

Ryan Punkte 15085

Über Facebooks Plattform-Updates :

Änderung des Umleitungsverhaltens

Diese Woche haben wir damit begonnen, ein Fragment #____=____ in die redirect_uri einzufügen, wenn dieses Feld leer gelassen wird. Bitte stellen Sie sicher, dass Ihre Anwendung dies verarbeiten kann Verhalten umgehen kann.

Um dies zu verhindern, setzen Sie die redirect_uri in Ihrer Login-URL-Anforderung wie folgt: (mit Facebook php-sdk)

$facebook->getLoginUrl(array('redirect_uri' => $_SERVER['SCRIPT_URI'],'scope' => 'user_about_me'));

UPDATE

Die obigen Ausführungen entsprechen genau dem Dokumentation sagt, dies zu beheben. Die von Facebook dokumentierte Lösung funktioniert jedoch nicht. Hinterlassen Sie bitte einen Kommentar auf der Facebook-Plattform-Updates Blog-Beitrag und folgen dieser Fehler um eine bessere Antwort zu erhalten. Bis dahin fügen Sie Ihrem Head-Tag Folgendes hinzu, um dieses Problem zu lösen:

<script type="text/javascript">
    if (window.location.hash && window.location.hash == '#_=_') {
        window.location.hash = '';
    }
</script>

Oder eine ausführlichere Alternative (danke niftylettuce ):

<script type="text/javascript">
    if (window.location.hash && window.location.hash == '#_=_') {
        if (window.history && history.pushState) {
            window.history.pushState("", document.title, window.location.pathname);
        } else {
            // Prevent scrolling by storing the page's current scroll offset
            var scroll = {
                top: document.body.scrollTop,
                left: document.body.scrollLeft
            };
            window.location.hash = '';
            // Restore the scroll offset, should be flicker free
            document.body.scrollTop = scroll.top;
            document.body.scrollLeft = scroll.left;
        }
    }
</script>

125voto

Paul Schwarz Punkte 1788

TL;DR

if (window.location.hash === "#_=_"){
    history.replaceState 
        ? history.replaceState(null, null, window.location.href.split("#")[0])
        : window.location.hash = "";
}

Vollversion mit Schritt-für-Schritt-Anleitung

// Test for the ugliness.
if (window.location.hash === "#_=_"){

    // Check if the browser supports history.replaceState.
    if (history.replaceState) {

        // Keep the exact URL up to the hash.
        var cleanHref = window.location.href.split("#")[0];

        // Replace the URL in the address bar without messing with the back button.
        history.replaceState(null, null, cleanHref);

    } else {

        // Well, you're on an old browser, we can get rid of the _=_ but not the #.
        window.location.hash = "";

    }

}

Schritt für Schritt:

  1. Wir werden nur in den Codeblock einsteigen, wenn die fragment es #_=_ .
  2. Prüfen Sie, ob der Browser die HTML5 window.replaceState Methode.
    1. Bereinigen Sie die URL durch Aufspaltung auf # und nur den ersten Teil zu nehmen.
    2. Informieren Sie history um den aktuellen Seitenstatus durch die saubere URL zu ersetzen. Dadurch wird der aktuelle Verlaufseintrag geändert, anstatt einen neuen zu erstellen. Das bedeutet, dass die Schaltflächen "Zurück" und "Vor" genau so funktionieren, wie Sie es wünschen ;-)
  3. Wenn der Browser die genialen HTML 5-Verlaufsmethoden nicht unterstützt, bereinigen Sie die URL so gut es geht, indem Sie den Hash auf eine leere Zeichenfolge setzen. Dies ist ein schlechter Ausweg, weil es immer noch einen Hash am Ende hinterlässt (example.com/#) und außerdem einen Verlaufseintrag hinzufügt, so dass die Schaltfläche "Zurück" Sie wieder zu #_-_ .

Erfahren Sie mehr über history.replaceState .

Erfahren Sie mehr über window.location .

68voto

Mark Murphy Punkte 2788

Dies wurde von Facebook aus Sicherheitsgründen eingeführt. Hier ist die Erklärung von Eric Osgood, einem Mitglied des Facebook-Teams:

Dies wurde als "by design" gekennzeichnet. weil dadurch eine potenzielle Sicherheitslücke vermieden wird.

Einige Browser fügen das Hash-Fragment einer URL an das Ende einer neuen URL an, an die sie weitergeleitet wurden (wenn diese neue URL nicht selbst ein Hash-Fragment hat).

Wenn zum Beispiel example1.com eine Weiterleitung zu example2.com zurückgibt, dann wird ein Browser, der zu example1.com#abc geht, zu example2.com#abc, und der Hash-Fragment-Inhalt von example1.com wäre für ein Skript auf example2.com zugreifen.

Da es möglich ist, einen Datenfluss auf einen anderen umzuleiten, ist es wäre es möglich, sensible Authentifizierungsdaten von einer App zu einer anderen für eine andere.

Dies wird durch das Anhängen eines neuen Hash-Fragments an die Umleitungs-URL entschärft um dieses Browserverhalten zu verhindern.

Wenn die Ästhetik oder das clientseitige Verhalten der resultierenden URL von Belang sind, wäre es möglich, window.location.hash zu verwenden (oder sogar eine eigene serverseitige Umleitung zu verwenden, um die anstößigen Zeichen zu entfernen.

Fuente: https://developers.facebook.com/bugs/318390728250352/

61voto

likebeats Punkte 866

Wenn Sie das verbleibende "#" aus der Url entfernen möchten

$(window).on('load', function(e){
  if (window.location.hash == '#_=_') {
    window.location.hash = ''; // for older browsers, leaves a # behind
    history.pushState('', document.title, window.location.pathname); // nice and clean
    e.preventDefault(); // no page reload
  }
})

13voto

mixmasteralan Punkte 479

Ich bin mir nicht sicher, warum sie das tun, aber Sie könnten dies umgehen, indem Sie die Raute oben auf Ihrer Seite zurücksetzen:

if (window.location.hash == "#_=_")
  window.location.hash = "";

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X