【发布时间】:2019-05-09 01:05:40
【问题描述】:
我制作了一个通用拦截器,用于在每个请求的标头中插入授权令牌。令牌从 Spring Boot 后端正确保存到会话存储中。相同的令牌在 Postman 中有效,但在 Angular 服务中失败(从 Spring Boot 调用 REST API 时)。在浏览器控制台中显示HTTP 500 invalid token 任何帮助将不胜感激。
JwtInterceptor.ts
import { Injectable } from '@angular/core';
import { HttpRequest, HttpHandler, HttpEvent } from '@angular/common/http';
import { Observable } from 'rxjs/Observable';
@Injectable()
export class JwtInterceptor {
constructor() {}
intercept(request: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
// add authorization header with jwt token if available
// tslint:disable-next-line:prefer-const
const token = sessionStorage.getItem('token');
if (token) {
request = request.clone({
headers: request.headers.set('Authorization', 'Bearer ' + token)
});
}
return next.handle(request);
}
}
【问题讨论】:
-
您不需要将令牌与不记名连接起来。
headers: request.headers.set('Authorization', token) -
检查标题部分浏览器网络选项卡。是否需要一个或者您传递了错误的格式或令牌。
-
@mxr7350 实际上,根据 oauth2 的规范,您必须在令牌前加上方案。否则你实现错了。
-
在浏览器中它以
Authorization: Bearer "eyJhbGciOiJIUzI1NiJ9.ey...J9.X4QO4XEk6qQkZ8GiqPPnmVweDNqsVmQfPu-5oSyG7s0"的形式出现,但在 Postman 中它以Authorization: Bearer eyJhbGciOiJIUzI1NiJ9.ey...J9.X4QO4XEk6qQkZ8GiqPPnmVweDNqsVmQfPu-5oSyG7s0的形式出现。我认为浏览器将其视为字符串还是什么?应该有问题吗? -
@TweaknFreak 您有两种选择:阻止将引号添加到存储中,或在检索令牌后删除引号。