我已經實作了 JWT 和重繪 令牌流。以前我實作這個的時候,我做的有點不同,主要是重繪 令牌是在body中發送的。
但是現在我做了不同的事情,我必須通過 Authorization 標頭發送訪問令牌,但我的攔截器代碼不想切換出不記名令牌。我該如何解決,如果我想重繪 ,我實際上使用重繪 令牌作為不記名令牌而不是已過期的訪問令牌?
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);
})
);
}
uj5u.com熱心網友回復:
您不應將訪問令牌替換為持有者令牌來重繪 它,而是使用重繪 令牌呼叫專用令牌端點以獲取新的訪問令牌。有時,根據設定,您也可能會得到一個新的重繪 令牌。
uj5u.com熱心網友回復:
您不應在Authorization標頭中使用重繪 令牌。這意味著您不應僅根據重繪 令牌的值來授權請求??。如果您這樣做,那么任何竊取重繪 令牌的人都將能夠使用它來獲取新的訪問令牌!重繪 令牌是發出新令牌所需的資料,但您應該以另一種方式授權客戶端(您的應用程式)。例如,您可以使用 HTTP 基本身份驗證并傳遞客戶端的 ID 和機密,或者使用更復雜的東西,例如雙向 TLS。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/376701.html
上一篇:在可觀察訂閱中呼叫服務
