2015-01-14 12 views
5

Ho un front-end sviluppato in AngularJS con ui-router. Per utilizzare l'API REST dal back-end ho bisogno di ottenere un token di accesso OAuth2 (concessione implicita).AngularJS interferenze con router-OIuth2 access_token

Il mio problema sta nel l'ultimo passo della danza OAuth, quando ricevo il token di accesso dal server di autenticazione nell'url

mydomain.com/home/#access_token=hdzjkdnba89fenbjkéz38U0D903ç&... 

mydomain.com/home essere il reindirizzamento URI, ovviamente.

solo una frazione di secondo dopo il reindirizzamento, AngularJS cambia l'URL in qualcosa di simile

mydomain.com/#/my-default-view 

e di conseguenza il token di accesso viene cancellato dal URL.

Un paio di cose ora:

  • non mi è permesso di definire un URI reindirizzamento contenente un hash ('#') per il mio cliente OAuth2. Quindi qualcosa come mydomain.com/#/auth-complete/ sarebbe non essere OK.
  • Io uso $routeProvider.otherwise('/').
  • Ho provato a impostare $locationProvider.html5Mode(true); per rimuovere il "#" nel mezzo, ma il problema è lo stesso (l'URL e il token di accesso vengono cancellati immediatamente dopo il reindirizzamento).
  • Poiché il token di accesso è ancora accessibile nella risposta HTTP anche dopo la modifica dell'URL da parte di Angular, potrei probabilmente utilizzare un intercettatore $http ma suona un po 'troppo per questa attività comune no?

Qualche consiglio?

+0

Probabilmente non si dispone di uno stato corrispondente per l'URL di autenticazione. Dato che hai $ routeProvider.otherwise ('/'), i modelli di url non corrispondenti verranno inoltrati alla directory principale del sito web. – erandac

+0

Ma come faccio a confrontare un URL contenente un token arbitrario? È possibile usare qualcosa come regex per dire "se l'url contiene 'access_token', non fare nulla"? – Buddyshot

+0

Sì, è possibile avere la corrispondenza regolare. Controlla la documentazione qui https://github.com/angular-ui/ui-router/wiki/URL-Routing – erandac

risposta

0

non sto usando più ui-router ma per coloro che hanno ancora bisogno di una soluzione alternativa, è necessario solo per prendere il gettone in una regex. Da the documentation, si può fare qualcosa di simile

.state('oauth.token', { 
     url: "/o/#{authToken:[0-9a-zA-Z]+}", 
     ... 
}) 

e ottenere il token di accesso in authToken.

+1

puoi approfondire la tua risposta? – JCC

+0

Intendi il token di accesso? destra? – Satyadev

5

Questo funziona per me con Google come fornitore OAuth2 per le applicazioni client-side:

$urlRouterProvider.otherwise('/'); 

$stateProvider.state('access_token', { 
    url: '/access_token={accessToken}&token_type={tokenType}&expires_in={expiresIn}', 
    template: '', 
    controller: function($stateParams) { 
     var token = $stateParams.accessToken; 
     // do something usefull with token 
    } 
}) 
Problemi correlati