Удалите хэш Facebook OAuth с помощью Angular JS

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

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

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

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

5 ответов

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

Вместо установки location.hash равной пустой строке, установите его в "#".

location.hash = '#';

PS

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

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

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

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

// 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 модуль вашего углового приложения. Он будет работать прозрачно при ВСЕХ запросах через службу $ http, поэтому вы можете захотеть выполнить дополнительную обработку, если вам нужно оставить некоторые URL-адреса в покое.

Я предполагаю, что вы говорите о https://www.facebook.com/dialog/oauth?client_id=...&redirect_uri=... вызове OAuth. В своем коде я предоставляю им 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'
  })
  ...
}]);

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

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

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

Кажется, что угловые изменения #_=_ в #/_=_так что мы можем сбросить его с $location.path('/'),

Это приведет к /#/ это обычный hashbang, который мы можем отключить с помощью режима html5.

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

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

Другие вопросы по тегам