Как лучше всего обращаться с внешним недоступным сервисом для SPA? - PullRequest
1 голос
/ 30 апреля 2020

Для личного проекта я разрабатываю портал, который предоставляет некоторые услуги только подключенным пользователям. Когда вы не подключены, вы перенаправляетесь на keycloak, который управляет потоком аутентификации (логин, восстановление пароля, ....) и перенаправляет в мое приложение angular с токеном, тогда для каждого вызова моего веб-сервиса я предоставляю токен, который проверяется для каждого запроса между моим веб-сервисом и keycloak.

Я разработал свое приложение следующим образом: (действительно простой вид) enter image description here

Проблема, с которой я столкнулся, заключается в том, что мое приложение angular сильно зависит от Keycloak и моего веб-сервиса. Я хотел бы, чтобы мое приложение было устойчивым и было готово, если хотя бы клавиатурный ключ и / или мой веб-сервис отключены, и в идеале, если произойдет какая-либо ошибка или нежелательное поведение (например, ошибка 500)

Я вижу несколько вещей, которые могу сделать :

  • Я мог бы создать анонимный макет (чтобы любой мог получить к нему доступ напрямую) в моем приложении angular с одной страницей, посвященной перенаправлению, которая сначала проверила бы доступность keycloak и моего веб-сервиса (простой http запрос, чтобы увидеть, если я получу код состояния 200), я мог бы сделать это в al oop (скажем, каждые 2 секунды) с информационным сообщением, показывающим статус, а затем, когда оба в порядке, перенаправив в приложение keycloak.
  • Я мог бы создать перехватчик, который будет отображать оверлей каждый раз, когда я получаю ответ с кодом состояния 401 в течение x секунд, а затем перенаправлять на страницу входа в систему keycloak.
  • Я мог бы показать универсальный модал c с информативным сообщением, когда Я получаю ответ с любым другим кодом состояния 400 или 500, который можно закрыть с помощью кнопки, приглашающей пользователя Расскажу об этом позже.

Это те идеи, которые у меня есть сейчас, но я не уверен, что это правильный путь.

Я не нашел ни одного соответствующего учебника или статьи, объясняющей как сделать это правильно (может быть, я использую плохие ключевые слова)

У вас есть идея?

Ответы [ 2 ]

2 голосов
/ 05 мая 2020

Я считаю, что лучший способ go - перехватчик, где вы можете обрабатывать различные ошибки. Например:

@Injectable()
export class RequestInterceptor implements HttpInterceptor {
  intercept (request: HttpRequest<any>, next: HttpHandler) : Observable<HttpEvent<any>> {
    return next.handle(request).pipe(
      catchError(error => {
        if (error.status === 0) {
          // Handle unreachable server
        }

        if (error.status === 401) {
          // Handle unauthenticated user
        }

        if (error.status === 500) {
          // Handle server error
        }

        return throwError(error);
      })
    );
  }
}

Проверка в l oop, доступна ли сервер, вызовет много нежелательных траффиков c на вашем бэкэнде, и я не уверен, что это решение, которое вы хотите go с, поскольку у вас могут возникнуть проблемы с масштабированием, если приложение вылетает.

1 голос
/ 05 мая 2020

Вы можете реализовать проверку здоровья перед перенаправлением, но я не вижу причины для этой проверки в l oop. Вы можете сделать это один раз, до фактического перенаправления только. Но это все еще наивный тест, потому что во время обработки запроса пользователя может быть ошибка, и вы хотите иметь возможность покрыть ее из SPA.

401 не проблема с недоступностью. Это информация, что запрос Unauthorized. Вы получите эту информацию от веб-службы, когда вы обычно используете просроченный токен. В этом случае неправильно перенаправлять пользователя на страницу входа в Keycloak. Там должно быть уже в месте тихое обновление, которое наблюдает за истечением, и оно будет «refre sh» токен до истечения срока. Стандартные библиотеки OID C angular предлагают эту функцию из коробки ( моя любимая библиотека lib : :)

...