【问题标题】:How to auto logout of application when jwt access token expires using angular?当jwt访问令牌使用角度过期时如何自动注销应用程序?
【发布时间】:2021-08-22 10:52:43
【问题描述】:

我正在使用 jwt 令牌在我的 angular(客户端)和 spring boot(服务器)应用程序中对用户进行身份验证。我希望用户在令牌过期时自动退出应用程序。我使用拦截器的概念来检查令牌是否过期并向用户显示“您的会话已过期”的弹出窗口并退出应用程序,如下所示:

export class TokenInterceptor implements HttpInterceptor {

constructor(private token: TokenStorageService, private router: Router) { }

intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
    {
        if (this.isTokenExpired()) {
            console.log("token is expired.");
            this.showSessionExpiredPopUp();
        }
        else {
            console.log("token is not expired.");
        }
        return next.handle(req);
    }
}

isTokenExpired() {
        const helper = new JwtHelperService();
        if (helper.isTokenExpired(this.token.getToken())) {
            return true;
        }
        return false;
    }

showSessionExpiredPopUp() {
        Swal.fire({
            html: 'Your session expired!',
        }).then((result) => {
            this.token.signout();
            window.location.href = '';
        });
    }

这工作正常,留下一个与弹出有关的问题。我在执行登录请求时也弹出此会话过期弹出,因为在向服务器发送登录请求时拦截器拦截。有没有办法在登录时不显示此弹出窗口?以角度处理这种自动注销场景的最佳方法是什么?

【问题讨论】:

  • 如果您的问题是弹出窗口正在显示,我通常会做这样的事情,我告诉某些 url 拦截器应该忽略:stackoverflow.com/a/55522787/7741865 其他答案在那里也是可行的。所以同样的想法,如果您正在登录,请不要检查令牌状态。

标签: angular jwt


【解决方案1】:

当您检测到令牌已过期时,请将其完全删除。然后,您将能够区分令牌过期且根本不存在令牌的情况。

或者,您可以在拦截器中跳过对登录 endoint 的检查,这样它将检查除登录请求之外的每个请求是否过期。

【讨论】:

    【解决方案2】:

    您可以如下更新拦截器和令牌过期方法,这里我们将在令牌过期后删除它并在验证时添加一个空检查:

    intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
        if (this.isTokenExpired()) {
            console.log("token is expired.");
            // here remove the auth token
            this.showSessionExpiredPopUp();
        } else {
            console.log("token is not expired.");
        }
        return next.handle(req);
    }
    
    isTokenExpired() {
        const helper = new JwtHelperService();
        return this.token.getToken() && helper.isTokenExpired(this.token.getToken());
    }
    

    【讨论】:

    • 注销成功,但我在登录时仍然收到会话过期弹出窗口。如何在登录时删除该弹出窗口?
    • 虽然登录令牌为空,但您是否进行了这两项更改?
    • 是的,我已经做了这两项更改。
    • 可以分享this.token.signout()的实现吗?
    • 这是注销代码:signout(): void { window.sessionStorage.clear(); }
    猜你喜欢
    • 2021-09-14
    • 2021-03-30
    • 2020-02-20
    • 2018-10-20
    • 2018-10-21
    • 2020-11-11
    • 2017-08-18
    • 2016-10-23
    • 2022-01-25
    相关资源
    最近更新 更多