当前位置: 首页 > 知识库问答 >
问题:

当jwt访问令牌使用angular过期时,如何自动注销应用程序?

梁嘉澍
2023-03-14

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

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

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

共有2个答案

东方嘉佑
2023-03-14

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

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());
}
谭毅然
2023-03-14

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

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

 类似资料:
  • 问题内容: 我在hapijs中使用jwt插件和策略。 我可以在登录用户时创建jwt令牌,并通过’jwt’策略使用同一令牌对其他API进行身份验证。 我将令牌设置为cookie,其中是令牌名称。另外,我没有将这些令牌保存在数据库中。 但是,注销时如何销毁jwt令牌? 请提出一种方法。 问题答案: JWT存储在浏览器中,因此删除令牌以删除客户端的cookie 如果您还需要在令牌到期之前从服务器端使令牌

  • 当用户单击注销按钮时,如何使JWT令牌无效?我做了一些研究,但没有找到任何好的实现。

  • 我有短过期(5分钟)的访问令牌和刷新令牌。 如何立即撤销特定用户的访问令牌? 例如,如果我想禁止某个用户?我点击了禁止按钮,现在我想立即撤销他的访问令牌。我不想等待令牌到期。 我需要以某种方式创建令牌黑名单,但如果我不知道特定用户的访问令牌,如何将其添加到黑名单? 我应该将所有 jwt 令牌存储在数据库还是 redis 中?代码示例将非常有帮助。 非常感谢。

  • 正如这里提到的http://projects.spring.io/spring-security-oauth/docs/oauth2.html,撤销是通过刷新令牌完成的。但这似乎不起作用。

  • 我使用JWT对用户进行身份验证。我可以看到JWT生成的两种令牌(向后端发出请求的访问令牌和刷新令牌)。所以,我的问题是,什么时候该注销用户?访问令牌到期的时间还是刷新令牌到期的日期 根据用户的活动或非活动状态,使用刷新令牌endpoint获取新访问令牌的更好方法是什么

  • 对于身份验证,目前我们使用JWT,因此一旦创建了令牌,它就会在整个生命周期内创建,如果我们设置了时间过期,令牌将过期。 有没有办法使令牌过期? 单击注销按钮时,我需要销毁令牌。 我正在使用ASP. NET Core WebAPI。