Как сделать приложение Angular 5 + Node с аутентификацией CAS?

В настоящее время я пытаюсь создать приложение, которому требуется, чтобы пользователь аутентифицировался с помощью CAS (Centrale Authentication Service), чтобы использовать его. Я использую Angular 5 для внешнего интерфейса и Node.js для внутреннего интерфейса.

Для аутентификации пользователя на стороне сервера я использую модуль под названием «r-cas-authentication», который создает экспресс-сеанс при аутентификации пользователя. Дело в том, что я не знаю, как проверить на стороне Angular, аутентифицирован ли пользователь, и в противном случае перенаправить его на страницу аутентификации CAS.

Ты знаешь, как я мог это сделать? Спасибо!

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
3
0
1 758
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вам не нужно заниматься этим на стороне angular. Просто сделайте так, чтобы сервер Node всегда перенаправлял неаутентифицированных пользователей на страницу входа. Браузер устанавливает заголовки сеанса, и ваш сервер Node увидит, что аутентификации нет, и отправит перенаправление. Модуль r-cas-authentication упоминает параметры bounce и bounce_redirect в документации, это еще больше упростит процесс.

Ваш экземпляр узла будет обслуживать страницу входа:

app.get('/login', (req, res) => res.sendFile('path/to/login.html'));

Кроме того, ваши активы (скрипты внешнего интерфейса, CSS, изображения и т. д.) (Обычно) могут иметь:

app.get('/assets', express.static(pathToStaticDirectory));

Также у вас есть конечная точка аутентификации:

app.get( '/authenticate', cas.bounce_redirect );

Затем он должен обслуживать приложение Angular. Однако здесь потребуется сеанс cas. Мы нацелены на '/home', но это может быть другой путь, например "/" или что-то еще.

app.get('/home', cas.bounce, express.static(pathToAngularAppDirectory);

Наконец, у вас, вероятно, будут конечные точки REST API, которые вы хотите защитить:

app.use('/api', cas.block, appRoutes);

Вот что происходит. Запрос приходит из браузера. Он попадает в маршрут '/home'. Поскольку браузер находится на первом посещении, заголовки аутентификации не заданы. Он попадет в блок cas.bounce() и будет перенаправлен на маршрут /login. Как только он попадает туда, он обслуживается login.html *.

Вы вводите свои данные для входа в систему и нажимаете кнопку входа в систему - страница отправляется, и промежуточное ПО cas аутентифицирует пользователя - устанавливает данные сеанса и все для браузера. Браузер позаботится об этом (заметьте, я говорю браузер, а не Angular). Он также перенаправляет пользователя обратно на домашнюю страницу.

Теперь ваш браузер имеет информацию о сеансе, поэтому он получает проход по маршруту, получает файлы Angular, приложение запускается нормально. Все круто.

Есть еще один случай, который вы могли бы решить с помощью Angular.

Допустим, ваша сессия истекла. И браузер остался открытым или что-то в этом роде. Пользователь повторно посещает страницу - все круто, cas.bounce перенаправит пользователя обратно в форму входа.

Но что, если пользователь просто нажимает кнопку «Обновить» в вашем приложении? Затем HttpClient Angular получает ответ 401 (согласно документации модуля узла). У вас может быть простой HTTP-перехватчик, который выполняет window.location.reload() или аналогичный (в основном полную перезагрузку страницы, а не навигацию на стороне клиента), и при перезагрузке страницы ваше приложение попадает в cas.bounce, потому что оно пытается перезагрузить / вернуться домой без аутентификации.

Спасибо за быстрый ответ. Но мне жаль, что я этого не понимаю. Если я вызываю сервер со стороны клиента, мне нужно будет перенаправить меня на страницу входа в CAS, работающую на другом сервере, и http-запрос от angular не будет правильным. Таким образом, перенаправление должно происходить со стороны Angular, и если я это сделаю хорошо, сервер аутентифицирует пользователя, но сеанс теряется, когда пользователь перенаправляется на исходную страницу.

Gauthier 27.03.2018 16:55

Это не имеет ничего общего с angular как таковым, это просто механизм браузера. Я расширю ответ, чтобы попытаться объяснить.

Zlatko 28.03.2018 06:42

Спасибо за развернутый ответ, я сделал именно это, и он отлично сработал!

Gauthier 10.06.2018 11:24

Другие вопросы по теме