Удалить Facebook OAuth хэш с Angular JS

Facebook любит добавлять #_=_ в конец URL-адреса обратного вызова OAuth, который мы ему даем. Хотя мы не используем навигацию на основе hash, она выглядит раздражающей, и я хотел бы избавиться от нее.

location.hash = ''; вызывает бесконечный цикл в $watch (это также происходит с $window.location.hash = '';). Angular способ $location.hash(''); ничего не меняет. $location.path(''); дает нам часть пути туда, в результате добавляя /#/ к нашему URL-адресу.

Я также играл с $locationProvider.html5Mode и не получал ничего, кроме ошибок. (Error: [$injector:unpr] Unknown provider: $locationProviderProvider <- $locationProvider ), хотя это может быть моей собственной ошибкой.

Как я могу удалить хеш OAuth без ошибок?

Ответы

Ответ 1

Как и для свойства поиска нужно начинать с?, свойство hash должно начинаться С#.

Вместо того, чтобы указывать location.hash равным пустой строке, установите ее в '#'.

location.hash = '#';

P.S.

Вы можете получить голоса из-за этого

Пока мы не используем навигацию на основе хэшей, она выглядит раздражающей, и я хотел бы избавиться от нее.

Несмотря на то, что у меня нет сомнений в этом, вопрос - это вопрос, независимо от причины, некоторые могут посчитать это пустой тратой времени, поскольку единственная воспринимаемая причина заключается в том, что вы находите это раздражающим.

Ответ 2

Я предполагаю, что вы говорите о https://www.facebook.com/dialog/oauth?client_id=...&redirect_uri=... OAuth call. В моем коде я предоставляю им URI с кодировкой URI с перекодировкой URI, который уже включает хэш, такой как myserver.com/myapp/#/login/facebook, поэтому их перенаправление будет обрабатываться в пределах маршрута AngularJS $routeProvider моего приложения. Как ни странно, Facebook присоединяется к '&' к пути после хэша, поэтому моя конфигурация $routeProvider выглядит как

myApp.config(['$routeProvider', function($routeProvider) {
  $routeProvider.
  when('/login/facebook', {
    templateUrl: 'dialogs/login/facebook.html',
    controller: 'LoginFacebookCtrl'
  }).
  when('/login/facebook&', { // Facebook seems to attach an & at the end
    templateUrl: 'dialogs/login/facebook.html',
    controller: 'LoginFacebookCtrl'
  })
  ...
}]);

Работает для меня.

Ответ 3

У меня нет опыта работы с FB, но мы делаем довольно много обработки URL-адресов, используя Angular http interceptors. Вы можете реализовать простую замену регулярных выражений на входящие данные таким образом (адаптированные из документов):

// register the interceptor as a service
$provide.factory('myHttpInterceptor', function($q, dependency1, dependency2) {
    return {
        'response': function(response) {
            // alter the response
            var loc = response.headers.location;
            response.headers.location = loc.replace(/#_=_$/,'');

            // pass along the altered response
            return response;
        }
    };
});
$httpProvider.interceptors.push('myHttpInterceptor');

Это относится к модулю .config вашего приложения Angular. Он будет работать прозрачно под всеми запросами через службу $http, поэтому вы можете захотеть выполнить дополнительную обработку, если вам нужно оставить только некоторые URL.

Ответ 4

Попробуйте добавить перенаправление, если оно вам подходит:

app.config(['$routeProvider', function ($routeProvider) {
  $routeProvider.when('/_=_', { redirectTo: '/' });
}]);

Ответ 5

Кажется, что Angular изменяет #_=_ на #/_=_, поэтому мы можем reset с $location.path('/').

Это приведет к /#/, который является обычным hashbang, который мы можем отключить, используя html5 mode.

myApp.config(['$locationProvider',
    function ($locationProvider) {
        $locationProvider.html5Mode(true);
    }]);

Вам нужно добавить тег <base href="/"> в разделе <head> в соответствии с его doc.