Question Facebook Callback ajoute '# _ = _' à ​​l'URL de retour


Le rappel Facebook a commencé à être ajouté #_=_ hash souligné à l'URL de retour

Quelqu'un sait-il pourquoi? Quelle est la solution?


425
2017-08-20 13:05


origine


Réponses:


via Mises à jour de la plateforme Facebook:

Modification du comportement de redirection de session

Cette semaine, nous avons commencé à ajouter un fragment # ____ = ____ à redirect_uri quand   ce champ est laissé vide. Veuillez vous assurer que votre application peut gérer cela   comportement.

Pour éviter cela, régler le redirect_uri votre login demande d'URL comme ceci: (en utilisant php-sdk Facebook)

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

METTRE À JOUR

Ce qui précède est exactement comme Documentation dit de résoudre ce problème. Cependant, la solution documentée de Facebook ne fonctionne pas. S'il vous plaît envisager de laisser un commentaire sur le Facebook Platform Updates blog post et suivre ce bug pour avoir une meilleure réponse. En attendant, ajoutez ce qui suit à votre balise principale pour résoudre ce problème:

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

Ou une alternative plus détaillée (merci 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>

223
2017-09-04 07:14



TL; DR

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

Version complète avec des instructions étape par étape

// 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 = '';

    }

}

Pas à pas:

  1. Nous allons seulement entrer dans le bloc de code si le fragment est #_=_.
  2. Vérifiez si le navigateur prend en charge la méthode HTML5 window.replaceState.
    1. Nettoyez l'URL en divisant # et en ne prenant que la première partie.
    2. Dire history pour remplacer l'état actuel de la page par l'URL propre. Cela modifie l'entrée de l'historique en cours au lieu d'en créer une nouvelle. Cela signifie que les boutons Précédent et Suivant fonctionneront comme vous le souhaitez. ;-)
  3. Si le navigateur ne supporte pas les impressionnants HTML 5 méthodes d'histoire puis juste nettoyer l'URL du mieux que vous pouvez en réglant le hachage à une chaîne vide. Ceci est un pauvre secours car il laisse encore un hachage de fuite (example.com/#) et aussi il ajoute une entrée d'historique, de sorte que le bouton retour vous ramènera à #_-_.

En savoir plus sur history.replaceState.

En savoir plus sur window.location.


92
2017-08-19 00:47



si vous voulez supprimer le "#" restant de l'URL

$(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
  }
})

56
2018-04-09 02:02



Cela a été mis en œuvre par Facebook pour des raisons de sécurité. Voici l'explication d'Eric Osgood, un membre de l'équipe Facebook:

Cela a été marqué comme "par conception"   car cela empêche une vulnérabilité potentielle de sécurité.

Certains navigateurs ajouteront le fragment de hachage d'une URL à la fin d'un   nouvelle URL vers laquelle ils ont été redirigés (si cette nouvelle URL ne   lui-même a un fragment de hachage).

Par exemple, si example1.com renvoie une redirection vers example2.com, un   navigateur aller à example1.com # abc ira à example2.com # abc, et le   le contenu de fragments de hachage de example1.com serait accessible à un   script sur example2.com.

Comme il est possible d'avoir un flux d'authentification redirigé vers un autre, il   serait possible d'avoir des données d'authentification sensibles d'une application accessible   à un autre.

Ceci est atténué en ajoutant un nouveau fragment de hachage à l'URL de redirection   pour empêcher ce comportement du navigateur.

Si l'esthétique ou le comportement côté client de l'URL résultante   de préoccupation, il serait possible d'utiliser window.location.hash (ou même   une redirection côté serveur de votre choix) pour supprimer le fautif   personnages.

La source: https://developers.facebook.com/bugs/318390728250352/


22
2018-01-29 03:25



Je ne sais pas pourquoi ils font cela mais, vous pouvez contourner cela en réinitialisant le hachage en haut de votre page:

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

10
2017-08-21 18:54



Facebook utilise un cadre et à l'intérieur de celui-ci tout fonctionne en utilisant la communication AJAX. Le plus gros problème dans ce cas est de préserver l'état actuel de la page. Pour autant que je comprends, Facebook a décidé d'utiliser des ancres simulées. Cela signifie que si vous avez cliqué quelque part, ils simulent cela comme une ancre à l'intérieur de votre page, et lorsque la communication AJAX démarre, ils modifient également le bit d'ancrage de votre URL.

Cette solution vous aide normalement lorsque vous essayez de recharger la page (pas ENTER, appuyez sur F5), car votre navigateur envoie l'URL complète avec des ancres au serveur Facebook. Par conséquent Facebook prend le dernier état (ce que vous voyez) et vous êtes alors en mesure de continuer à partir de là.

Lorsque le rappel revient avec #_=_ cela signifie que la page était dans son état de base avant de la quitter. Parce que cette ancre est analysée par le navigateur, vous n'avez pas à vous en préoccuper.


8
2017-08-25 10:15



Vous pouvez également spécifier votre propre hachage sur le redirect_uri paramètre pour le rappel Facebook, qui pourrait être utile dans certaines circonstances, par ex. /api/account/callback#home. Lorsque vous êtes redirigé, ce sera au moins un hachage qui correspond à une route connue si vous utilisez backbone.js ou similaire (pas sûr de jquery mobile).


8
2018-04-30 16:43