页面刷新时 JWT Token 已从标题中删除,如何修复?

Posted

技术标签:

【中文标题】页面刷新时 JWT Token 已从标题中删除,如何修复?【英文标题】:JWT Token was removed from header when page refreshed, How can fix it? 【发布时间】:2020-01-01 09:18:51 【问题描述】:

我正在使用基于 Jwt 令牌的身份验证并使用 Angular 7 和 node.js,我想使用令牌向服务器发送 POST 请求,一切正常,但是当我重新加载页面时出现此错误服务器端:

我在中间件中有这个 node.js 代码:

router.all('/*', function (req, res, next) 

    let tok = '';
    tok =  req.headers["authorization"].split(' ')[1] ||  req.headers["authorization"];

    jwt.verify(tok, secureKeyToken, (err, token) => 
        if (err) return console.log('NO TOKEN! VERIFY');
        res.locals.token  = token;
        next();
    );
);

我在 Angular 中有这段代码:

httpOptions = 
  headers: new HttpHeaders(
    "authorization": this._token.tokenGetter() || ''
  )
;


reloadVorlage(id)

  let endpoint = this.HOST_TURL + '/vorlag/go' // get one

  return this.httpClient.post(endpoint, id,this.httpOptions)
  .pipe(catchError(this.errorHandler));


问题是,为什么我重新加载页面时令牌会消失?以及如何解决?

我的英语很差,见谅。

【问题讨论】:

【参考方案1】:

为了让 JWT 在页面刷新后可用,您必须将其存储在客户端。您可以使用浏览器 localStorage 或 cookie。我是这个链接会帮助你https://stormpath.com/blog/where-to-store-your-jwts-cookies-vs-html5-web-storage

【讨论】:

【参考方案2】:

您必须将 jwt 令牌存储在本地存储(客户端)中。因此,当您登录时,您会在 api 中生成令牌并将其发送到 Angular 应用程序。 在您的 Angular 应用程序中,您将收到令牌,因此您可以将其放在本地存储中:

localStorage.setItem("token", receivedToken);

然后,您可以添加一个 HttpInterceptor 来拦截您的所有请求,并自动在授权标头中添加令牌。

拦截器类似于:

import  Injectable  from '@angular/core';
import 
  HttpRequest,
  HttpHandler,
  HttpEvent,
  HttpInterceptor
 from '@angular/common/http';
import  AuthService  from './auth/auth.service';
import  Observable  from 'rxjs/Observable';
@Injectable()
export class TokenInterceptor implements HttpInterceptor 
  constructor(public auth: AuthService) 
  intercept(request: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> 

    request = request.clone(
      setHeaders: 
        Authorization: `Bearer $this.auth.getToken()`
      
    );
    return next.handle(request);
  

这里有一个指南:https://medium.com/@ryanchenkie_40935/angular-authentication-using-the-http-client-and-http-interceptors-2f9d1540eb8

如果您不将令牌存储在客户端,则重新加载页面后将无法保留。

【讨论】:

以上是关于页面刷新时 JWT Token 已从标题中删除,如何修复?的主要内容,如果未能解决你的问题,请参考以下文章

Android携带token登陆验证与刷新token

刷新 JWT 过期而不刷新或生成新 Token

springboot+jwt刷新token

ASP.NET Core Web Api之JWT刷新Token

JWT, 为啥需要刷新令牌?

JWT - 第二次刷新后的 TOKEN_EXPIRED