2016-05-03 10 views
1

Ich verwende den impliziten Oauth-Grant-Flow für die Anmeldung bei einer Anwendung. Wenn ein Benutzer die Website zugreift, die nicht authentifiziert ist, werden sie mit der folgenden Struktur an eine URL gesendet:Safari interpretiert URL-Variable nicht?

baseurl + '/oauth/authorize?response_type=token&client_id=xxxx&redirect_uri=' + redirecturl 

baseurl die Lage der Seite ist, die die Eingänge enthält für Ihren Benutzernamen und Ihr Passwort eingeben. Wenn Sie die korrekten Anmeldeinformationen eingeben und auf die Schaltfläche "Anmelden" auf dieser Seite klicken, sollten Sie an die Adresse redirecturl weitergeleitet werden. redirecturl ist der Speicherort der Anwendung selbst (eine eckige App), auf die der Benutzer zuerst zuzugreifen versuchte.

Der folgende Code behandelt den Fall, nachdem der Benutzer auftritt angemeldet hat:

$urlRouterProvider 
      .when('/token_type=bearer&access_token=:accessToken', function ($location, $state, User, storageService) { 
        storageService.clearAll(); 
        User.authenticate($location.path().substr(1)); 
        $state.go('marketplace.applications'); 
       } 
     ); 

Wenn ich Chrome verwenden, funktioniert alles wie erwartet. Wenn ich Safari verwende, wird der obige Code niemals ausgeführt.

Beachten Sie, dass :accessToken in der Zeichenfolge enthalten ist, die an $urlRouterProvider.when() übergeben wird.

Ich habe einige Untersuchungen durchgeführt und festgestellt, dass ich das gleiche Verhalten in Chrome reproduzieren kann, wenn ich den :accessToken Teil der Zeichenfolge entfernt, die an $urlRouterProvider.when() übergeben wird. Dies lässt mich glauben, dass Safari die :accessToken Variable nicht interpretieren kann. Gibt es etwas darüber, wie Safari URLs interpretiert, die nicht mit dem vorhandenen Code kompatibel sind oder ist es etwas ganz anderes?

Vielen Dank.

Antwort

0

Es stellt sich heraus, :accessToken war ein Red Hering.

Der Grund für das Entfernen von :accessToken verursachte das gleiche Verhalten in Chrome war, weil es bedeutete, dass URL nicht übereinstimmte, was im Browser war, so dass der Code nicht ausgeführt wurde. In Safari wurde der Code jedoch aufgrund einer unterschiedlichen Nichtübereinstimmung in der URL nicht ausgeführt, was damit zu tun hat, was der redirecturl festgelegt wurde.

Ursprünglich hatte ich die redirecturl auf baseurl + '/test' eingestellt. Dies führte dazu, dass die URL, die vom Server zurückgesetzt wurde, baseurl + 'test/#token_type' war.

Wenn diese URL navigiert, hinzugefügt Chrome automatisch ein /, die URL zu baseurl + 'test/#/token_type' ändern, die meine $urlRouterProvider.when() Funktion passen konnte.

Safari hat keine / so $urlRouterProvider.when() nie eine Übereinstimmung gefunden und der Code wurde nicht ausgeführt.

Ich konnte dies lösen, indem sie meine erste redirecturl zu baseurl + '/test/' statt baseurl + '/test'

Einstellung
Verwandte Themen