0

我正在开发一个 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);
        }
    }
}
4

2 回答 2

2

所以我意识到,在解码该值后,它仍然有 '%' 字符,但输出看起来确实与输入略有不同。所以我只是链接了几次相同的东西,现在它可以工作了:

decodeURIComponent(decodeURIComponent(decodeURIComponent(access_token)))

...伟大的

于 2016-11-14T08:27:16.550 回答
0

这是从常量模拟解码的技巧:

var result = eval('decodeURI("'+text+'")');
于 2017-07-25T11:20:40.710 回答