Как сделать единый вход с PHP?

Например: доступ к Gmail, Orkut, Wava и feedburner, используя единую учетную запись google.

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

С другой стороны, если вы пытаетесь позволить своим пользователям войти на несколько веб-сайтов, которыми вы управляете с одной учетной записью, вот как вы можете это сделать:

Сделайте все ссылки на входах на своих сайтах, указав на централизованную страницу входа, но включите информацию о том, откуда пришел пользователь в ссылке. Например:

<a href='http://login.example.com/login.php?source=my.other.site.com/foo/bar'>log in!!</a> 

Затем, как только пользователь выполнил вход в систему, вы перенаправляете пользователя обратно на исходный сайт, передавая всю необходимую информацию об аутентифицированном пользователе.

Тем не менее, вам также необходимо убедиться, что люди не могут просто обойти ваш механизм аутентификации, добавив необходимые параметры аутентификации в URL. Это можно сделать, включив сигнатуру в форме HMAC-SHA-256 параметров плюс секрет, который хранится как на сервере регистрации, так и на исходном сайте. (Предпочтительно этот ключ должен отличаться для каждого сайта, используя вашу систему единого входа).

 <?php $MySecretKey = 'Nobody Will Ever Guess This!!'; // Generate signature from authentication info + secret key $sig = hash( 'sha256', $user->id . $user->email, $MySecretKey ); // Make sure we're redirecting somewhere safe $source = parse_url($_GET['source']); if(in_array($source->host, $list_of_safe_hosts)) $target = 'http://'.$source->host.$source->path; // Send the authenticated user back to the originating site header('Location: '.$target.'?'. 'user_id='.$user->id. '&user_email='.urlencode($user->email). '&sig='.$sig); ?> 

Затем на исходном сайте, если подпись совпадает с пользователем, уже зарегистрирована. Сохраните информацию о зарегистрированном пользователе в переменных сеанса (а не в файле cookie):

 <?php $MySecretKey = 'Nobody Will Ever Guess This!!'; // Set not logged in by default $user_id = 0; $user_email = ''; if(intval($_GET['user_id']) && !$_SESSION['user_id']) // Someone trying to log in? { // See if they have the right signature if (hash_equals(hash('sha256', intval($_GET['user_id']).$_GET['user_email'], $MySecretKey), $sig)) { $_SESSION['user_id'] = intval($_GET['user_id']); $_SESSION['user_email'] = $_GET['user_email']; } } ?> 

Обратите внимание, что я использую функцию, добавленную в PHP 5.6: hash_equals . Если вы находитесь ниже 5.6, вы можете использовать эту функцию-заменитель, которая реализует функцию сравнения по времени с использованием двойной проверки HMAC :

 function hash_equals($a, $b) { $key = mcrypt_create_iv(128, MCRYPT_DEV_URANDOM); return hash_hmac('sha512', $a, $key) === hash_hmac('sha512', $b, $key); } 

Очевидно, это очень грубая реализация, но она должна стать достойной отправной точкой.

Если вам нужна центральная система входа в межсайтовый сайт, я бы рекомендовал что-то вроде OpenID . Вы можете запустить свой собственный сервер, а затем иметь только один логин для нескольких сайтов.

У вас есть один центральный реестр для аутентифицированных пользователей.

Все приложения обращаются к этому родителю, чтобы получить аутентификацию.

Файлы cookie с перекрестными доменами могут выполняться со специальными ссылками с помощью nonce, а новый новый cookie создается в новом домене, если nonce соответствует действительному токену от родителя.