angular2通过服务刷新令牌
在我的项目中,后端公开了刷新令牌api。当您登录时,您将获得有效令牌和刷新令牌。当令牌过期时,您需要进行刷新调用,并使用旧的过期令牌和参数刷新令牌进行授权。响应返回新的有效令牌和新的刷新令牌。目前,我正试图在我的授权保护中实现它。代码如下: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
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的事件。。。我必须单击菜单中的另一项,然后路径被成功激活。你知道怎么处理这条路的阻塞吗?对不起,我没有答案。