gpt4 book ai didi

Angular JWT 拦截器切换不记名 token 以进行刷新

转载 作者:行者123 更新时间:2023-12-05 04:40:27 24 4
gpt4 key购买 nike

我已经实现了 JWT 和刷新 token 流程。我以前实现这个的时候有点不同,主要是刷新 token 是在正文中发送的。

但现在我的做法有所不同,我必须通过授权 header 发送访问 token ,但我的拦截器代码不想切换不记名 token 。我该如何解决,如果我想刷新,我实际上使用刷新 token 作为承载 token 而不是已过期的访问 token ?

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

我还尝试在发布请求中将 HTTP header 设置为授权承载 token

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

最佳答案

您不应将访问 token 替换为不记名 token 以刷新它,而应使用刷新 token 调用专用 token 端点以获取新的访问 token 。有时,根据设置,您可能还会取回新的刷新 token 。

关于Angular JWT 拦截器切换不记名 token 以进行刷新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70268648/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com