Ладно, ребята. Я обнаружил эту ошибку в течение двух дней после некоторого исследования без каких-либо успехов.
Итак, я пытаюсь реализовать функцию обновления токенов. Logi c работает хорошо только в том случае, если мне нужно решить одну дорожную преграду.
Итак, если срок действия токена пользователя истек и он пытается получить доступ к ресурсу из серверной части, мой HttpErrorResponse на передней панели получает нижеприведенное;
Now, based on my logic. I want to use the status property in the response to determine what I should do next.
Initially, I had this header;
введите описание изображения здесь
Но я провел небольшое исследование, где увидел фрагмент кода и попробовал его. Итак, вот как я настроил токен jwt в своем классе Startup;
services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
.AddJwtBearer(options =>
{
options.TokenValidationParameters = new TokenValidationParameters
{
ValidateIssuerSigningKey = true,
ValidateIssuer = true,
ValidateAudience = true,
ValidIssuer = appSettings.Site,
ValidAudience = appSettings.Audience,
IssuerSigningKey = new SymmetricSecurityKey(Encoding.ASCII
.GetBytes(appSettings.Secret)),
ClockSkew = TimeSpan.Zero
};
//code gotten from one issue here on SO
options.Events = new JwtBearerEvents()
{
OnAuthenticationFailed = context =>
{
context.Response.StatusCode = StatusCodes.Status401Unauthorized;
context.Response.ContentType = "application/json; charset=utf-8";
var message = ENV.IsDevelopment() ? context.Exception.ToString() : "An error occurred processing your authentication.";
var result = JsonConvert.SerializeObject(new { message });
// context.Response.AddApplicationError(result);
return context.Response.WriteAsync(result);
}
};
});
Когда я использовал почтальон для имитации этого, я получил 401 unauthorized, что выглядит неплохо. Но на интерфейсе, когда я проверил свойство status в HttpErrorResponse, я получил значение статуса 0.
Вот мой лог перехватчика c
intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
return next.handle(this.attachTokenToRequest(req)).pipe(
tap((event: HttpEvent<any>) => {
if (event instanceof HttpResponse) {
console.log('Success!!!');
}
}), catchError((error): Observable<any> => {
debugger;
if (error instanceof HttpErrorResponse) {
// here the status property always gets 0 as a value instead of 401.
console.log(error);
// (<HttpErrorResponse>error).status
switch (error.status) {
case 401:
console.log('Token expired! Attempting refresh...');
return this.handleHttpResponseError(req, next);
case 400:
return <any>this.authService.logout();
default:
this.authService.logout();
break;
}
} else {
return throwError(this.handleGlobalError(error));
}
})
);
}
Итак, пожалуйста, мой вопрос то есть, как я могу или как лучше всего вернуть код состояния 401, когда срок действия токена истек?
Благодарю за любую помощь.