В Интернете много информации об использовании 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?
Мы не хотим ничего интересного, мы будем довольны главным образом используемым решением!