Подтвердить что ты не робот

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

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

4b9b3361

Ответ 1

Ваш вопрос слишком неспецифичен, чтобы дать точный ответ. Если вы пытаетесь разрешить пользователям входить на ваш сайт с помощью учетных записей 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);
}

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

Ответ 2

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

Ответ 3

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

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

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