Как продлить токен - возврат правильного кода HttpStatus в Netcore 3.1 на Angular - PullRequest
0 голосов
/ 09 июля 2020

Ладно, ребята. Я обнаружил эту ошибку в течение двух дней после некоторого исследования без каких-либо успехов.

Итак, я пытаюсь реализовать функцию обновления токенов. Logi c работает хорошо только в том случае, если мне нужно решить одну дорожную преграду.

Итак, если срок действия токена пользователя истек и он пытается получить доступ к ресурсу из серверной части, мой HttpErrorResponse на передней панели получает нижеприведенное; enter image description here

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, когда срок действия токена истек?

Благодарю за любую помощь.

...