2016-11-13 18 views
0

我有一個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); 
     } 
    } 
} 

回答

1

所以我意識到值解碼後,它仍然有「%」的角色,但輸出確實看起來與輸入略有不同。所以,我只是鏈接同樣的事情了幾次,現在它的工作原理:

decodeURIComponent(decodeURIComponent(decodeURIComponent(access_token)))

...偉大

0

這從不斷模仿解碼破解:

var result = eval('decodeURI("'+text+'")');