У меня есть приложение 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);
}
}
}