【问题标题】:angular2 refresh token via serviceangular2 通过服务刷新令牌
【发布时间】:2017-06-24 07:05:48
【问题描述】:

在我的项目中,后端公开了刷新令牌 api。当您登录时,您将获得有效的令牌和刷新令牌。当令牌过期时,您需要进行刷新调用,使用旧的过期令牌和参数刷新令牌进行授权。响应返回新的有效令牌和新的刷新令牌。目前我正试图在我的授权守卫中实现它。这是代码:

 import { Injectable } from '@angular/core';
 import { Router, CanActivate, ActivatedRouteSnapshot, RouterStateSnapshot }     from '@angular/router';
 import { Observable } from 'rxjs/Rx';

 import { SessionService } from '../services/session.service';

@Injectable()
export class AuthorizationGuard implements CanActivate {

constructor(private sessionService: SessionService, private router: Router) { }

canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): boolean | Observable<boolean> {
    if (this.sessionService.isAuthenticated() ) {
        console.log('guard has cookies');
        return true;
    } else {
        if(this.sessionService.checkStorageSession() == null) {
            this.router.navigate(['/']);
        } else {
            console.log('guard will refresh token via refresh token call  ');
            this.sessionService.refreshToken()
                .subscribe(
                    data => {
                        console.log('guard  refresh success');
                        this.sessionService.destroySessionCookie();
                        this.sessionService.rememberUser(data.accessToken);
                        this.sessionService.rememberRefreshTocken(data.refreshToken);
                        this.sessionService.setSessionCookie(data.accessToken);
                        this.sessionService.setRefreshTocken(data.refreshToken);
                        return true;
                    },
                    error => {
                        console.log('session refresh fail: ' + error);
                        this.router.navigate(['/']);
                        return false;
                    }
            );
        }
    }
}

}

但问题是 canActivate 调用,调用开始,刷新令牌,但在刷新成功响应之前,我从激活页面上的其他调用获得 403 未授权。当我站在带有保存按钮的页面上时,我也无法弄清楚如何刷新令牌,令牌过期,我按下保存并进行更新调用,但令牌已过期。请建议方法:s

【问题讨论】:

    标签: angular authentication token access-token angular2-guards


    【解决方案1】:

    我使用了这种方法,在 AuthorizationGuard 中你检查了:

    if(!this.sessionService.isUserAuthenticated){
      this.router.navigate(['/']);
    }
    

    其中 isAuthenticated=true 表示用户拥有有效的 refreshToken。 我覆盖了 http 服务以具有刷新令牌逻辑:

    var authenticatedCall: Observable<any>;
          if (needToken) {
              if (this.sessionService.isUserAuthenticated) {
                   authenticatedCall = this.sessionService.acquireToken()
                   .flatMap((token: string) => {
                             if (options1.headers == null) {
                               options1.headers = new Headers();
                             }
                                options1.headers.append('Authorization', 'Bearer ' + token);
                                return this.http.request(url, options1);
                         });
                    }
                    else {
                        authenticatedCall = Observable.throw(new Error("User Not Authenticated."));
                    }
            }
            else {            
                authenticatedCall = this.http.request(url, options).map(this.extractData);
     }
    

    例如,我使用了这个:https://github.com/sureshchahal/angular2-adal/blob/master/src/services/authHttp.service.ts

    【讨论】:

    • 谢谢兄弟!有效!我现在只有一个问题 - 当我使用防护激活时会进行刷新调用,但之后它不会转到我从菜单中单击的路径。同样在刷新令牌后,我尝试第二次单击同一项目,但未调用守卫事件...我必须从菜单中单击另一个项目,然后成功激活路径。知道如何处理这种卡住的路径吗?
    • 对不起,我没有答案。
    猜你喜欢
    • 2020-07-11
    • 1970-01-01
    • 2018-02-18
    • 2012-04-18
    • 1970-01-01
    • 2018-09-15
    • 1970-01-01
    • 2018-07-18
    • 2016-09-16
    相关资源
    最近更新 更多