angular2通过服务刷新令牌

angular2通过服务刷新令牌,angular,authentication,token,access-token,angular2-guards,Angular,Authentication,Token,Access Token,Angular2 Guards,在我的项目中,后端公开了刷新令牌api。当您登录时,您将获得有效令牌和刷新令牌。当令牌过期时,您需要进行刷新调用,并使用旧的过期令牌和参数刷新令牌进行授权。响应返回新的有效令牌和新的刷新令牌。目前,我正试图在我的授权保护中实现它。代码如下: import { Injectable } from '@angular/core'; import { Router, CanActivate, ActivatedRouteSnapshot, RouterStateSnapshot } fro

在我的项目中,后端公开了刷新令牌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;
                    }
            );
        }
    }
}
从'@angular/core'导入{Injectable};
从'@angular/Router'导入{Router,CanActivate,ActivatedRouteSnapshot,RouterStateSnashot};
从'rxjs/Rx'导入{Observable};
从“../services/session.service”导入{SessionService};
@可注射()
导出类AuthorizationGuard实现CanActivate{
构造函数(私有会话服务:会话服务,私有路由器:路由器){}
canActivate(路由:ActivatedRouteSnapshot,状态:RouterStateSnashot):布尔值|可观察{
if(this.sessionService.isAuthenticated()){
log('guard有cookies');
返回true;
}否则{
if(this.sessionService.checkStorageSession()==null){
this.router.navigate(['/']);
}否则{
log('警卫将通过刷新令牌调用刷新令牌');
this.sessionService.refreshtToken()
.订阅(
数据=>{
console.log('guard refresh success');
this.sessionService.DestroySessionOkie();
this.sessionService.rememberUser(data.accessToken);
this.sessionService.rememberRefreshTocken(data.refreshttoken);
this.sessionService.setSessionCookie(data.accessToken);
this.sessionService.setRefreshTocken(data.refreshToken);
返回true;
},
错误=>{
log('会话刷新失败:'+错误);
this.router.navigate(['/']);
返回false;
}
);
}
}
}
}


但问题是canActivate调用,调用启动,刷新令牌,但在刷新成功响应之前,我从激活页面上的其他调用中得到403个未经授权的调用。此外,当我站在带有保存按钮的页面上时,我也不知道如何刷新令牌,令牌过期,我按下保存并发出更新呼叫,但使用过期的令牌。请建议方法:s

我使用了这种方法,在授权保护中,您检查了:

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);
 }

var authenticatedCall:Observable

我使用了这种方法,在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);
 }

var authenticatedCall:Observable

谢谢兄弟!成功了!我现在只有一个问题-当我使用防护激活is时,它会发出刷新呼叫,但之后它不会转到我从菜单中单击的路径。同样,在刷新令牌后,我尝试再次单击同一项,但未调用guard的事件。。。我必须单击菜单中的另一项,然后路径被成功激活。你知道怎么处理这条路吗?对不起,我没有答案。谢谢兄弟!成功了!我现在只有一个问题-当我使用防护激活is时,它会发出刷新呼叫,但之后它不会转到我从菜单中单击的路径。同样,在刷新令牌后,我尝试再次单击同一项,但未调用guard的事件。。。我必须单击菜单中的另一项,然后路径被成功激活。你知道怎么处理这条路的阻塞吗?对不起,我没有答案。