2016-11-13 8 views
0

私が取り組んでいるAngular2/TypeScriptアプリケーションがあります。私は認証のためにOAuth 2.0サービスでImplicit Authを使用しています。ブラウザはユーザーを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+'")'); 
関連する問題