我正在开发一个 Angular2/TypeScript 应用程序。我将隐式身份验证与 OAuth 2.0 服务一起用于身份验证。浏览器将用户重定向到 OAuth 端点以登录他们的帐户,然后根据规范重定向回我的应用程序。重定向包含访问令牌作为 URI 参数的一部分。此访问令牌包含由浏览器进行 URL 编码的特殊字符,因此我必须先对令牌进行解码,然后才能将其传递给 OAuth 服务进行身份验证。
这是一个早已过期的示例(编码)令牌: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);
}
}
}