当用户第二天登录时,它会保持缓存并显示被破坏的应用程序。一旦用户的令牌过期,我们如何将其重定向到登录页面?我们使用基于角6的离子3的JWT。
Token service (provider)
import { Injectable } from '@angular/core';
import { Storage } from '@ionic/storage';
@Injectable()
export class TokenProvider {
constructor(private storage: Storage) { }
SetToken(token) {
return this.storage.set('auth-token', token);
}
async GetToken() {
return await this.storage.get('auth-token');
}
DeleteToken() {
this.storage.remove('auth-token');
}
async GetPayload() {
const token = await this.storage.get('auth-token');
let payload;
if (token) {
payload = token.split('.')[1];
payload = JSON.parse(window.atob(payload));
}
return payload.data;
}
}阻断器
import { switchMap } from 'rxjs/operators';
import { TokenProvider } from './token/token';
import { Observable } from 'rxjs/Observable';
import { fromPromise } from 'rxjs/observable/fromPromise';
import { Injectable } from '@angular/core';
import {
HttpInterceptor,
HttpRequest,
HttpHandler,
HttpEvent
} from '@angular/common/http';
@Injectable()
export class TokenInterceptor implements HttpInterceptor {
constructor(private tokenProvider: TokenProvider) {}
intercept(
req: HttpRequest<any>,
next: HttpHandler
): Observable<HttpEvent<any>> {
return fromPromise(this.tokenProvider.GetToken()).pipe(
switchMap(token => {
const headersConfig = {
'Content-Type': 'application/json',
Accept: 'application/json'
};
if (token) {
headersConfig['Authorization'] = `beader ${token}`;
}
const _req = req.clone({ setHeaders: headersConfig });
return next.handle(_req);
})
);
}
}app组件:
this.storage.get('auth-token').then(token => {
if (token) {
this.tokenProvider.GetPayload().then(data => {
const params = {
room: 'global',
user: data.username
};
this.socket.emit('online', params);
});
this.nav.setRoot('TabsPage');
} else {
this.nav.setRoot('LoginPage');
}
});
});
}但它似乎仍然不起作用。当令牌过期时,它仍然保持页面活动,没有任何数据,看上去就像一个被破坏的应用程序。如何解决此问题并将用户重定向到登录页?
发布于 2019-07-08 10:10:35
有两种方法可以处理令牌过期,
import { switchMap } from 'rxjs/operators';
import { TokenProvider } from './token/token';
import { Observable } from 'rxjs/Observable';
import { fromPromise } from 'rxjs/observable/fromPromise';
import { Injectable } from '@angular/core';
import {
HttpInterceptor,
HttpRequest,
HttpHandler,
HttpEvent
} from '@angular/common/http';
@Injectable()
export class TokenInterceptor implements HttpInterceptor {
constructor(private tokenProvider: TokenProvider) {}
intercept(
req: HttpRequest<any>,
next: HttpHandler
): Observable<HttpEvent<any>> {
return fromPromise(this.tokenProvider.GetToken()).pipe(
switchMap(token => {
const headersConfig = {
'Content-Type': 'application/json',
Accept: 'application/json'
};
if (token) {
headersConfig['Authorization'] = `beader ${token}`;
}
const _req = req.clone({ setHeaders: headersConfig });
return next.handle(_req).do((event: HttpEvent<any>) => {
if (event instanceof HttpResponse) {
// do stuff with response if you want
}
}, (err: any) => {
if (err instanceof HttpErrorResponse) {
if (err.status === 401) {
// redirect to the login route
// or show a modal
}
}
});
})
);
}
}import { Injectable } from '@angular/core';
import { Router, CanActivate } from '@angular/router';
import { AuthService } from './auth.service';
@Injectable()
export class AuthGuardService implements CanActivate {
constructor(public auth: AuthService, public router: Router) {}
canActivate(): boolean {
if (!this.auth.isAuthenticated()) {
this.router.navigate(['login']);
return false;
}
return true;
}
}发布于 2019-07-08 10:23:35
在本例中使用事件。当登录请求获得错误作为令牌、过期或无效凭据时发布事件,并在app.component.ts上订阅它,您可以在其中将登录页设置为根页。
https://stackoverflow.com/questions/56932309
复制相似问题