Реализация, ориентированная на пользователя
Ваша команда решила использовать «Keycloak» в качестве нового безопасного инструмента, и вы, как фронтенд-разработчик, должны настроить его в своих приложениях Vue? Поздравляю! Вы только что нашли способ реализовать простой, умный и ориентированный на пользователя подход.
Нет функции setInterval, нет сохраненных бесполезных токенов
Как и вы, когда мне пришлось реализовать Keycloak в моем приложении Vue, я нашел несколько руководств, но большинство из них рассматривалось как POC (доказательство концепции), поскольку они используют setInterval
function для обновления токена или хранения бесполезных токенов и обновления токенов. Дело в том, что когда я хочу что-то реализовать, я хочу быть уверенным в себе и понимать, как это работает.
Обнаружение адаптера Keycloak JS
Покопавшись в официальной документации Keycloak JS Adapter, я заметил, что экземпляр Keycloak поставляется с конфигурацией, параметрами инициализации и двумя основными функциями:
Конфигурация
const keycloak = new Keycloak({
url: 'http://keycloak-server/auth',
realm: 'myrealm',
clientId: 'myapp'
});
В конструкторе вы передаете конфигурацию проекта Keycloak.
в этом
keycloak
.init(initOptions)keycloak
.init({ onLoad: 'login-required' })
Функцию init следует вызывать в вашем приложении один раз. Можно установить параметры инициализации. В моем случае я решил использовать параметр onLoad
со значением login-required
, который проверяет, вошел ли пользователь уже в систему. В противном случае отобразится страница входа в Keycloak.
updateToken
keycloak
.updateToken(minvalidity: number)
Функция updateToken
используется для обновления токена доступа и возобновления сеанса пользователя. Например, если срок жизни токена доступа в настройках вашей области установлен на 5 минут и вы установили 70 (секунд) в качестве минимального значения, функция updateToken проверит, истечет ли срок действия токена в течение этих 70 секунд. Если этого не произойдет, ничего не будет сделано. Если это так, Keycloak попытается возобновить сеанс пользователя. Если срок действия токена уже истек, Keycloak отключит пользователя и перенаправит на страницу входа.
Ориентированный на пользователя подход
Узнав, как работает JS-адаптер Keycloak, я решил использовать Keycloak с умным и ориентированным на пользователя подходом. Что это значит ? Значит, я сосредоточился на функции updateToken и подумал, где и когда ее использовать. По моему мнению, updateToken должен вызываться, когда пользователь выполняет действия в приложении. Я выделил 3 из них:
- Взаимодействие с API: создание, редактирование, удаление…
- Навигация
- Сосредоточьтесь на вкладке приложения
Это означает, что каждый раз, когда пользователь совершает одно из этих событий, должна вызываться функция updateToken
. Таким образом, если пользователь совершит действие с истекшим сеансом, он будет отключен мгновенно. Это важно, чтобы пользователь доверял приложению.
Сколько раз я вижу пользователей, которые обновляют страницу, чтобы убедиться, что они все еще подключены.
В следующем разделе посмотрим, как мне это удалось.
Реализация с использованием Vue CLI
Я предполагаю, что у вас уже есть приложение Vue, созданное с помощью Vue CLI, или вы собираетесь его создать.
Создайте файл env с переменными конфигурации
Переменные должны быть предоставлены вашей командой. Не забывайте, что каждый из них должен иметь префикс VUE_APP
, так как это обрабатывается с помощью Vue CLI.
Установите плагин Keycloak с vue cli
npm i keycloak-js —S
Создайте файл плагина Keycloak
Файл плагина создаст одноэлементный экземпляр Keycloak, который будет доступен с файлом Vue global.
import Vue from 'vue'; Vue.$keycloak
Другим разработчикам также легче найти, где настроен экземпляр Keycloak. Файл необходимо поместить в каталог плагинов. Вы заметили, что значения конфигурации устанавливаются из переменных среды. Если вы используете Netlify, их легко настроить.
Инициализация Keycloak
В вашем основном файле (main.js или main.ts) запустите Keycloak, используя параметр login-required
, поэтому, если пользователь уже вошел в систему, приложение Vue будет загружено. В противном случае отобразится страница входа в систему. Обратите внимание, что Keycloak перенаправляет на страницу, где он был запущен. Поэтому, если вы загружаете свое приложение с URL-адреса, отличного от URL-адреса домашней страницы (например, страницы продукта), Keycloak будет перенаправлять на эту страницу продукта.
Поскольку приложение Vue загружается лениво, подумайте о том, чтобы показать пользователям приятное сообщение о загрузке, отредактировав индексный html-файл в общедоступном каталоге.
Обновите токен пользователя
Поскольку функция updateToken
принимает параметр и ее нужно использовать в нескольких файлах, я решил создать функцию промежуточного программного обеспечения, чтобы упростить управление. Я поместил файл в каталог под названием "middleware", аналогично каркасу Nuxt. Функция промежуточного программного обеспечения возвращает новый токен, если он обновлен.
Вызов промежуточного программного обеспечения в действиях пользователя
Запомните действия, на которые я нацелен: взаимодействия с API, навигация, фокус на вкладке приложения.
Взаимодействие с API
Я предполагаю, что вы используете Axios и даже лучше плагин Axios для Vue CLI. Вам просто нужно добавить перехватчик запросов. У него есть 2 преимущества.
- Во-первых, перед отправкой запроса необходимо проверить, действителен ли сеанс пользователя.
- Во-вторых, токен всегда обновляется в заголовках авторизации запросов API.
Навигация
Просто вызовите промежуточное ПО в $route
callback в App.vue. Таким образом, для каждой навигации по маршрутизатору будет вызываться промежуточное программное обеспечение, которое отключит пользователя с истекшим сеансом.
Сосредоточьтесь на вкладке
У пользователей вашего приложения также есть другие открытые вкладки в своем браузере. Поэтому, если они вернутся через долгое время на вкладку вашего приложения, будет вызвано промежуточное ПО. Следующий код можно разместить в основном файле.
Что ж, все готово. Надеюсь, вы оценили это руководство по добавлению Keycloak в приложение Vue. Я был бы рад получить от вас аплодисменты и / или комментарии.