2014-02-04 5 views
15

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

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

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

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

+0

Угловая ошибка о 'Unknown provider' может быть вызвана тем, что у вас не установлено ngRoute, которое распалось на собственный файл пару версий назад. –

+0

Где в вашем коде помещается 'set_ $ locationProvider.html5Mode()' setter? –

+0

$ location.hash (''), похоже, успешно удаляет хэш для меня. Вы называете это из-за угла? Если это так, вы должны вызвать $ scope. $ Apply, чтобы это вступило в силу. – Sasha

ответ

0

Я предполагаю, что вы говорите об 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' 
    }) 
    ... 
}]); 

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

+0

Я не использую 'ng-route' в этом проекте. – SomeKittens

0

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

+0

Закройте, но это недействительное решение. Это проблема загрузки страницы, а не проблема '$ http'. – SomeKittens

+0

есть пример этого, на который я мог бы смотреть. Хотелось бы помочь, но я не уверен, какой механизм предоставляет URL-адрес (перенаправление, запрос данных и т. Д.) И как вы хотите его использовать (перепишите на более «стиль» стиля «отдыха», дисплей и т. Д.). – gkl

+1

У вас отсутствует оператор возврата перед объявлением ключевого слова «ответ» – deb0rian

-1

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

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

Бэкэнд не видит хеш по запросам. – SomeKittens

+0

Кто говорит о бэкэнде? На самом деле это код интерфейса. –

+0

А, прочитайте это как экспресс-маршрут. – SomeKittens

-1

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

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

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

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

2

Как поиск необходимо начинать с ?, хэш собственность должна начинаться с #.

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

location.hash = '#'; 

P.S.

Вы могли бы получать вниз голосов из-за этого

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

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