私が取り組んでいる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);
}
}
}