微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

用户登录,但令牌没有更改,在使用angular中的JWT Auth刷新之前

如何解决用户登录,但令牌没有更改,在使用angular中的JWT Auth刷新之前

我在jwt中用jwt创建身份验证

在我的服务api中

login(body: any) {
  return this._http.post(this.apiURL + 'login',body,{
    observe: 'body',}
}

在我的登录功能

login() {
    this.loading = true;
    setTimeout(() => {
      this.auth.login(this.loginForm.value)
      .subscribe(
        data => {
          localStorage.setItem('userData',JSON.stringify(data));
          console.log(data);
          this.successMessage = data;
          this.userService.getUserName().subscribe(
            (data: any) => {
              this.userChange.next(data.data);
              localStorage.setItem('displayName',data.data.displayName);
              if (data.data.emailVerified != true) {
                this.router.navigateByUrl('/auth/email-verification');
              }
              if (data.data.kewirusType == 'user') {
                this.router.navigateByUrl('/pages/projects/all-project')
              } else if (data.data.kewirusType == 'admin') {
                localStorage.setItem('kewirusType',data.data.kewirusType);
                console.log(localStorage.getItem('kewirusType'));
                this.router.navigateByUrl('/pages/admin/users-list');
              }
            },)
        },error => {
          this.loading = false
          console.log(error.error.message[0]);
          this.errorMessage = error.error.message[0];
        }
      )});
    
  }

因此,当我第一次登录时,假设我使用管理员帐户,然后注销,然后我使用用户帐户登录,这给了管理员帐户而不是用户帐户。和令牌

这是注销前的管理员令牌

enter image description here

这里是登录后的用户帐户,它返回相同的令牌

enter image description here

在我刷新页面后,令牌在更改

enter image description here

我已经和我的后端进行了交谈,但是他说这是从我前端的代码而不是他的,但是我找不到问题所在,有人知道为什么会这样吗?

编辑

这是我的api要求提供用户详细信息

 getUserName() {
    return this._http.get<User[]>(this.apiURL + 'auth/user')
  }

几个小时后寻找问题,我认为这与更改标头授权令牌有关,因为在用户使用其他帐户注销后它没有更改。注销时有什么方法可以刷新标题吗?

解决方法

localStorage.clear();函数上使用logout()

,

所以我想通了,这是因为auth-interceptor是我的代码

getToken() {
  return this.userData.data.token;
}

intercept(req: HttpRequest<any>,next: HttpHandler): Observable<HttpEvent<any>> {

  if (this.getToken() != null) {
    const clonedReq = req.clone({
      headers: req.headers.set('Authorization','Bearer ' + this.getToken())
    });
    return next.handle(clonedReq).pipe(
      tap(
        succ => {
          },err => {
          if (err.status == 401) {
            this.getToken();
            this.router.navigateByUrl('/auth/login');
          } else if (err.status == 403) {
            this.router.navigateByUrl('/forbidden');
          }
        }
      )
    )
  }
  else {
    return next.handle(req.clone());
  }
}

我发现了这段代码https://stackblitz.com/edit/angular-6-jwt-authentication-demo?file=src%2Fapp%2Fhelpers%2Fjwt.interceptor.ts

intercept(request: HttpRequest<any>,next: HttpHandler): Observable<HttpEvent<any>> {
  // add authorization header with jwt token if available
  let currentUser = JSON.parse(localStorage.getItem('userData'));
  if (currentUser && currentUser.data.token) {
    request = request.clone({
      setHeaders: {
        Authorization: `Bearer ${currentUser.data.token}`
      }
    });
  }
  return next.handle(request);
}

然后它起作用了,如果有人可以解释这会有所帮助

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?