Axios отлов просроченного сертификата

142
25 января 2020, 06:10

У меня на localhost:8080 живёт небольшой фронтенд на vue, который при помощи axios черпает данные с localhost:1234

При этом на localhost:44306 сертификат самоподписанный, поэтому его приходится периодически добавлять в исключения:

В firefox это добавление действует сутки, кажется. Я специально не добавляю его в исключения на постоянной основе, так как хочу выводить нормальное уведомление при логине: мол, "на бекенде самоподписанный сертификат" или "на бекенде протух сертификат". Особенно вот эта вот вторая ошибка меня прямо интересует, хочется её красиво отловить и показать пользователю.

Однако при дефолтных настройка axios не показывает, что сертификат самопоподписан и недоверен, нет! Для него - "сервер выключен"!

И вот эта мисдиагностика меня просто вообще убивает. Т.е. одно дело, когда пользователи могли бы позвонить и сказать "серт протух", а тут в корне неверное сообщение, которое первую линию техподдержки будет только сбивать с толку, пуская по ложному следу.

Что делать? В какую сторону податься?

Из того, что сам накопал из ежедневных наблюдений.

Известно, что когда идёт запрос на бекенд сначала идёт тестовый запрос OPTIONS, который сначала просто тестирует жив ли сервер, можно ли к нему обращаться (cross origin policy) и т.п. И только после этого идёт реальный POST запрос:

Если же сертификат просрочен - то сразу как только отваливается OPTIONS - уже POST не делается (и это логично), но вот только почему-то этот первый OPTIONS наверху выглядит как сервер недоступен, а не как сертификат просрочен.

В хроме такая же ситуация, проверил для очистки совести, хотя хромом не пользуюсь, т.к. он показывает не все запросы.

Код тривиальный, привожу на всякий случай:

import axios from 'axios';
import { API_URL } from '@/config/config';
import store from '@/store';
const ApiService = {
  init() {
    ApiService.AxiosReq = axios.create();
    axios.defaults.headers.common.Authorization = `Bearer ${store.state.auth.token}`;
    axios.defaults.headers.post['Content-Type'] = 'application/json';
    axios.defaults.baseURL = API_URL;
  },
  post(resource, params) {
    return ApiService.AxiosReq.post(resource, JSON.stringify(params));
  },
  get_error(error) {
    if (error.response) {
      if (error.response.status === 400) {
        return 'Неверный логин и/или пароль.';
      }
      if (error.response.status === 401) {
        return 'Истёк срок токена. Нажмите Logout, затем войдите снова.';
      }
      if (error.response.status === 403) {
        return 'Недостаточно прав для выполнения этой операции.';
      }
      return error.response.status;
    }
    if (error.request) {
      return 'Сервер недоступен. Попробуйте позднее.';
    }
    return error.message;
  },
};
export default ApiService;

Обработку ошибок делал по образцу на офсайте axios.

В error ничего нет, за что можно зацепиться - только общее "Network error"

READ ALSO
Как интегрировать на сайт данные из профиля в Инстаграме?

Как интегрировать на сайт данные из профиля в Инстаграме?

На сайте https://ivararu/ внизу главной страницы есть слайдер с фотками из Инстаграма, при клике на фотки открывается модальное окно с фоткой и комментариями...

136
Как объединить данные JS скрипты?

Как объединить данные JS скрипты?

у меня есть два скрипта для формаПервый ajax скрипт отправляет ajax форму с данными на е-майл

115
Изменение jsf страницы из другой страницы

Изменение jsf страницы из другой страницы

Хочу по нажатию на ссылку на одной странице, изменить элемент другой страницы(изменить тэг) и что-бы это было real time, подскажите как можно это...

140