我已经实现了 JWT 和刷新令牌流。当我过去实现这一点时,我的做法略有不同,主要是刷新令牌是在正文中发送的。
但是现在我做了不同的事情,我必须通过授权标头发送访问令牌,但是我的拦截器代码不想切换不记名令牌。如何修复,如果我想刷新,我实际上使用刷新令牌作为不记名令牌,而不是过期的访问令牌?
intercept(
request: HttpRequest<any>,
next: HttpHandler
): Observable<HttpEvent<any>> {
const token = this.userService.getJWTToken();
if (token) {
request = this.addToken(request, token);
}
return next.handle(request).pipe(
catchError((error) => {
if (error instanceof HttpErrorResponse && error.status === 401) {
return this.handle401Error(request, next);
} else if (error.status !== 0) {
return throwError(error);
}
})
);
}
private addToken(request: HttpRequest<any>, token: string): HttpRequest<any> {
return request.clone({
setHeaders: {
Authorization: `Bearer ${token}`,
},
});
}
private handle401Error(
request: HttpRequest<any>,
next: HttpHandler
): Observable<HttpEvent<any>> {
if (!this.isRefreshing) {
this.isRefreshing = true;
this.refreshTokenSubject.next(null);
//This is what I've tried, to switch out the tokens
request = this.addToken(request, this.userService.getRefreshToken());
//this.userService.refreshToken() is a POST request, where I want the refresh token as the bearer token, instead of the access token
return this.userService.refreshToken().pipe(
switchMap((token: TokenDTO) => {
this.isRefreshing = false;
this.refreshTokenSubject.next(token.accessToken);
return next.handle(this.addToken(request, token.accessToken));
})
);
} else {
return this.refreshTokenSubject.pipe(
filter((token) => token != null),
take(1),
switchMap((accessToken) =>
next.handle(this.addToken(request, accessToken))
)
);
}
}
我还尝试在post请求中将HTTP标头设置为授权承载令牌
public refreshToken(): Observable<TokenDTO> {
const headers = new HttpHeaders({
'Content-Type': 'application/json',
Authorization: `Bearer ${this.getRefreshToken()}`,
});
return this.httpClient
.post<TokenDTO>(`${this.hostname}/users/refreshToken`, {}, headers)
.pipe(
tap((tokens: TokenDTO) => {
this.saveTokens(tokens);
})
);
}
您不应该在授权
标头中使用刷新令牌。这意味着您不应该仅根据刷新令牌的值来授权请求。如果您这样做,那么任何窃取刷新令牌的人都可以使用它来获取新的访问令牌!刷新令牌是颁发新令牌所需的数据,但您应该以另一种方式授权客户端(您的应用程序)。例如,您可以使用HTTP Basic身份验证并传递客户端的ID和机密,或者使用更复杂的东西,例如相互TLS。
不应将访问令牌替换为持有者令牌来刷新它,而应使用刷新令牌调用专用令牌终结点以获取新的访问令牌。有时,根据设置,您可能还会返回新的刷新令牌。
我需要(在拦截器类中)对403禁止的HTTP状态(获取/刷新)JWT令牌作出反应,并使用新令牌重试请求。 在下面的代码中,当服务器返回错误响应时,它将转到成功回调(而不是像我预期的那样进入错误回调),事件是typeof object(这在错误响应的反应中是无用的)。事件对象如下所示:{type:0}。 问题: -当我需要刷新accessToken并重试http请求时,如何在HttpIntercep
我正在从事一个spring boot angular项目,其中用户从angular前端登录到spring boot上的身份验证api,该api返回一个JWT令牌。我还在Angular上设置了一个拦截器,该拦截器为所有请求附加带有JWT令牌的授权头。 我正在寻找一种拦截angualar请求的方法,这样当spring boot在JWT令牌过期后抛出401错误时,Angular前端将尝试使用过期的JWT
我有一个使用express api的react应用程序。我正在尝试在访问令牌过期时刷新令牌。我正在使用axios拦截器来实现这一成就。 它卡在某个地方了。我使用console.log来调试它。从控制台; 发布http://localhost:5000/api/auth/token?null 401(未经授权) 之后什么都没发生。我该怎么办?谢谢你的帮助
我正在构建一个使用JWT进行身份验证的应用程序。我开始做一些研究,但对于诸如刷新令牌和令牌存储之类的主题缺乏共识,我感到惊讶。 据我所知,JWT和OAuth是两个不同的协议,它们遵循不同的规范。 但我的问题是,对于一个没有通过第三方资源服务器如Google、Facebook等认证的应用程序,有一个刷新令牌真的有用吗?为什么不让JWT令牌像刷新令牌一样持续时间长。 另一方面,我可以看到,如本文所述,
null 实现基于Spring Boot with Spring Security(OAuth2)。我有以下工作2LA流程: RP可以使用和向AS发送访问令牌请求。 AS使用访问令牌响应RP。 RP能够使用所述接入令牌向RS发出授权请求。 RS能够使用AS上的endpoint验证访问令牌。 问题:在上面的步骤1中,我需要对我的AS进行哪些更改,以便它接受基于JWT的访问令牌请求? RP OAuth
我在网上尝试了一些建议,但没有帮助。是否需要在客户端做任何事情来修复CORS相关的问题--或者这都是服务器端的问题?