angular2 通过服务刷新令牌
angular2 refresh token via service
在我的项目中,后端暴露了刷新令牌 api。当您登录时,您将获得有效令牌和刷新令牌。当令牌过期时,您需要进行刷新调用,并使用旧的过期令牌和参数刷新令牌进行授权。响应 returns 新的有效令牌和新的刷新令牌。目前我正在尝试在我的授权保护中实施它。这是代码:
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
我使用了这种方法,在 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
在我的项目中,后端暴露了刷新令牌 api。当您登录时,您将获得有效令牌和刷新令牌。当令牌过期时,您需要进行刷新调用,并使用旧的过期令牌和参数刷新令牌进行授权。响应 returns 新的有效令牌和新的刷新令牌。目前我正在尝试在我的授权保护中实施它。这是代码:
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
我使用了这种方法,在 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