2016-11-13 4 views
0

У меня есть приложение Angular2/TypeScript, над которым я работаю. Я использую Implicit Auth с помощью службы OAuth 2.0 для аутентификации. Браузер перенаправляет пользователя в конечную точку OAuth для входа в свою учетную запись и затем перенаправляется обратно в мое приложение согласно спецификации. Переадресация содержит токен доступа как часть параметров URI. Этот токен доступа содержит специальные символы, которые кодируются URL-адресом браузером, поэтому я должен декодировать токен, прежде чем я смогу передать его службе OAuth для аутентификации.JavaScript decodeURIComponent не расшифровывается из переменной

Вот пример (кодируются) маркер, который уже давно истекли: 1468463839895.39e131aa-7a82-4267-b126-c087d6abe515.285ae51e-41b4-4f88-ba64-d968b20f2dde.39400b6b-47f3-4585-b51f-bd3c5c8953c7%3B1.MCwCFBxaflXgZrxvuGa5D3vM%2FnFustT9AhQWlix2a3Lb9Yj9i9lo8ICR27HvxA%3D%3D

После строк расщепления запроса вручную, чтобы получить маркер, я тогда просто позвонить decodeURIComponent(access_token), и я представил с тем же не- декодированный токен. Кажется, это не работает.

Однако, если поместить контрольную точку, скопируйте кодированный маркер, и выполнить следующие действия в моей JS консоли, она работает:

decodeURIComponent('1468463839895.39e131aa-7a82-4267-b126-c087d6abe515.285ae51e-41b4-4f88-ba64-d968b20f2dde.39400b6b-47f3-4585-b51f-bd3c5c8953c7%3B1.MCwCFBxaflXgZrxvuGa5D3vM%2FnFustT9AhQWlix2a3Lb9Yj9i9lo8ICR27HvxA%3D%3D')

Что это дает? Он не работает с переменной через мой код, но если я проверю значение моей переменной и снова использую ее вручную в консоли, она работает. У меня нет исключений, брошенных на меня.

Я также попытался разбить токен с помощью .split('.'), а затем декодировать каждую часть, но это также просто возвращает то же входное значение.

Ниже приведено больше кода для контекста. Я использую Angular 2 Guard на маршруте.

В моей службе охраны:

canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): boolean { 
    let url: string = state.url; 
    return this.checkLogin(url); 
} 

checkLogin(url: string): boolean { 
    if (this.authService.accessToken) { 
     return true; 
    } 
    else if (url.indexOf('#access_token') > -1) { 
     this.authService.processAccessTokenUrl(url); 
     this.authService.afterLoginRedirect(); 
    } 
    else { 
     // Navigate to the login page 
     this.authService.login(); 
     return false; 
    } 
} 

и в моем AuthService:

login(): void { 
    window.location.href = this.OAuthUrl; 
} 
afterLoginRedirect(): void { 
    this.router.navigate(['/dashboard']); 
} 
processAccessTokenUrl(url: string): void { 
    this.responseParts = url.split('&'); 
    if (this.responseParts[0].indexOf('access_token') > -1) { 
     let ndxEql = this.responseParts[0].indexOf('=') + 1; 
     let access_token = this.responseParts[0].substr(ndxEql, this.responseParts[0].length - ndxEql); 
     if (access_token.length > 0) { 
      this.accessToken = decodeURIComponent(access_token); 

      // THIS IS WHERE THE PROBLEM IS - BOTH LOG THE SAME OUTPUT 
      console.log('accessToken RAW', access_token); 
      console.log('accessToken DECODED', this.accessToken); 
     } 
    } 
} 

ответ

1

Таким образом, я понял, что после расшифровки значения, он все еще был «%» символы, но вывод сделал Посмотрите, что-то немного отличается от ввода. Так что я просто прикован одно и то же несколько раз, и теперь он работает:

decodeURIComponent(decodeURIComponent(decodeURIComponent(access_token)))

... большой

0

Это хак подражать расшифровывает от постоянного:

var result = eval('decodeURI("'+text+'")'); 
Смежные вопросы