Основная идея в ссылке, на которую вы ссылаетесь, в порядке, но она также говорит об управлении сеансами - забудьте о том, что хранить в базе данных - все, что вам нужно сделать, это включить сеансы на главном сервере и клиенте. И сохраните аутентифицированное имя пользователя в сеансе (главным образом, чтобы вы могли видеть, был ли пользователь имеет аутентификацию).
- Пользователь переходит на сайт клиента
- Клиентский сайт перенаправляет на главный сайт, чтобы проверить, вошел ли пользователь в систему.
Нет - вы перенаправляете только с подчиненного сайта (называя его клиентом становится запутанным), если подчиненный сайт определяет, что пользователь не был аутентифицирован.
Забудьте о RFC 4122 - это просто умный способ получить uuids, которые используются в посте, который вы называете идентификаторами сеанса. PHP уже генерирует совершенно хорошие значения.
Вам необходимо передать какое-то сообщение обратно от главного к подчиненному, которое предоставляет идентификатор пользователя и тот факт, что пользователь прошел аутентификацию в URL-адресе (вы не можете передавать куки-файлы по доменам и не можете делать ПОСТ в редирект). Один из очевидных способов сделать это - поделиться секретом как с ведущим, так и с ведомым, а затем ...
$redirect_to='http://slave.example.com/sso_lander.php?auth_token='
. encrypt($some_random_alphanum_chars
. '/' . $user . '/'
. time(), $shared_secret);
header("Location: $redirect_to", true, 303);
Тогда на рабе:
if (!($_SESSION['authenticated_user']) && $_GET['auth_token']) {
$auth_token=explode('/',decrypt($_GET['auth_token'], $shared_secret));
if ((abs($auth_token[2]-time())<3) {
// if more than 3 seconds after generate - DO NOT USE
$_SESSION['authenticated_user']=$auth_token[1];
}
}
Обратите внимание, что выше это только для иллюстрации - все еще есть небольшое окно, открытое для атак воспроизведения и других вещей, которые должны быть убраны - лучшее решение состоит в том, что ведомое устройство генерирует вызов, которое оно хранит в локальном сеансе, и копирует хозяин. Мастер включает это в зашифрованный ответ. Но код для этого немного сложнее.
С