В Інтернеті є багато інформації про використання JWT ( Json Web Token
) для аутентифікації. Але я все ще не знайшов чіткого пояснення того, яким повинен бути потік при використанні жетонів JWT для єдиного рішення для входу в середовищі кількох доменів .
Я працюю в компанії, яка має багато сайтів у різних хостів. Давайте скористаємося example1.com та example2.com . Нам потрібно єдине рішення для входу, що означає, що якщо користувач перевіряє автентифікацію на example1.com , ми хочемо, щоб він також був автентифікований на example2.com автоматично.
Використовуючи потік OpenId Connect , я розумію, що користувач, який хоче пройти автентифікацію на example1.com , спочатку буде переспрямований на сервер аутентифікації (або OP
: "Провайдер OpenId"). Користувач аутентифікується на цьому сервері, який потім перенаправляє його назад на оригінальний сайт example1.com з підписаним маркером JWT. (Я розумію, є ще один потік, який повертає проміжний маркер, який згодом можна обміняти на справжній маркер JWT, але я не думаю, що це потрібно для нас) ...
Отже, тепер користувач повернувся на сторінку example1.com і має автентифікацію! Він може робити запити, передаючи маркер JWT у Authentication
заголовок, і сервер може перевірити підписаний JWT і, таким чином, може ідентифікувати користувача. Приємно!
Перше питання:
Як маркер JWT повинен зберігатися на клієнті? Знову, про це багато інформації, і люди, схоже, згодні, що використання Web Storage
- це шлях, а не добрий старий cookies
. Ми хочемо, щоб JWT був стійким між перезавантаженнями браузера, тому давайте використовувати Local Storage
, а не Session Storage
...
Тепер користувач може перезапустити свій веб-переглядач, і він все ще буде автентифікований на example1.com , доки термін JWT не закінчився!
Крім того, якщо example1.com потребує запиту Ajax до іншого нашого домену, я розумію, що налаштування CORS це дозволить. Але основним нашим випадком використання є не міждоменні запити, це єдине рішення для входу !
Тому головне питання:
Тепер, яким повинен бути потік, якщо користувач переходить на example2.com і ми хочемо, щоб він був аутентифікований, використовуючи маркер JWT, який у нього вже є? Local Storage
Схоже, не дозволяє міждоменний доступ, тому в цей момент браузер не може прочитати токен JWT для запитів на example2.com !
Потрібно:
- Користувача знову буде переспрямовано на сервер аутентифікації ? Коли користувач пройшов автентифікацію для example1.com , сервер автентифікації, можливо, встановив на нього cookie, щоб цей новий запит на аутентифікацію для example2.com міг використати цей файл cookie, щоб побачити, що користувач вже автентифікований, і негайно перенаправляє його назад на example2.com з тим же маркером JWT?
- Чи може браузер на example2.com отримати доступ до токена JWT без необхідності повторного переходу на сервер аутентифікації ? Я бачу, що є рішення для зберігання даних , але чи широко застосовуються такі? Чи запропоновано вони рішення для міждоменного середовища SSO?
Ми не хочемо нічого фантазійного, ми були б задоволені в основному використовуваним рішенням!