我有一個Angular2/TypeScript應用程序正在處理。我使用隱式身份驗證和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);
}
}
}