Вот он.
Возможно и не самый, но один из самых простых.
Не используем никаких библиотек, с ними еще разбираться нужно.
Это именно пример, он не оформлен в некую законченную структуру, написан прямолинейно.
Так проще разобраться.
Здесь можно запустить тест
Здесь можно скачать
Там два файла:
1. request.php – его запускаем
2. callback.php – получает ответ
Дальнейший текст содержится в комментариях к коду
Файл request.php
Файл callback.php
Документация от Google находится здесь
Возможно и не самый, но один из самых простых.
Не используем никаких библиотек, с ними еще разбираться нужно.
Это именно пример, он не оформлен в некую законченную структуру, написан прямолинейно.
Так проще разобраться.
Здесь можно запустить тест
Здесь можно скачать
Там два файла:
1. request.php – его запускаем
2. callback.php – получает ответ
Дальнейший текст содержится в комментариях к коду
Файл request.php
<?php session_start(); function curlRequest ($pUrl, $pParam = array(), $Meth = 'get') { $sRes = ''; $ch = curl_init(); curl_setopt($ch, CURLOPT_HEADER, 0); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); if ($Meth == 'post') { curl_setopt($ch, CURLOPT_POST, 1); curl_setopt($ch, CURLOPT_URL, $pUrl); curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($pParam)); } else { curl_setopt($ch, CURLOPT_URL, $pUrl . '?' . http_build_query($pParam)); } $sRes = curl_exec($ch); curl_close($ch); return $sRes; } /* Сначала получаем GoogleEndPoint - URL, на который будем отправлять запросы и переадресоваваться */ $Resp = curlRequest('https://www.google.com/accounts/o8/id'); $wA = array(); preg_match('/<URI>.*URI>/', $Resp, $wA); $GoogleEndPoint = str_replace('<URI>', '', str_replace('</URI>', '', $wA[0])); /* Теперь AssociationData. В этом примере будем хранить их в сессии */ if (empty($_SESSION['GoogleAssociationData'])) { $aPrm = array(); $aPrm['openid.ns'] = 'http://specs.openid.net/auth/2.0'; $aPrm['openid.mode'] = 'associate'; $aPrm['openid.assoc_type'] = 'HMAC-SHA1'; $aPrm['openid.session_type'] = 'no-encryption'; $Resp = curlRequest($GoogleEndPoint, $aPrm); $GoogleAssociationData = array(); $Resp = explode("\n", $Resp); foreach ($Resp as $Line) { if (!empty($Line)) { list($k) = explode(':', $Line); $GoogleAssociationData[$k] = str_replace($k . ':', '', $Line); } } $_SESSION['GoogleAssociationData'] = $GoogleAssociationData; /* Ответ от Google содержит все то, что мы отправляли в запросе плюс: $GoogleAssociationData['assoc_handle'] - Handle, который теперь связывает наш сайт и Google, по сути токен $GoogleAssociationData['expires_in'] - время жизни assoc_handle в секундах. Время это довольно большое около 13 часов. Если возникнет необходимость оптимизировать приложение, сократить количество выдаваемых запросов, то можно сохранить эти данные где нибудь в базе данных или файле и использовать в течение срока их жизни. В этом примере будем просто хранить их в сесии. $GoogleAssociationData['mac_key'] - ключ для проверки электронной подписи (параметр №3 в функции hash_hmac) Когда callback.php получит от Google данные, необходимо будет проверить их аутентичность. Есть два метода сделать это: 1. Посчитать электронную и сравнить с той, что пришла. Тут понадобится mac_key 2. Отправить данные на проверку в Google. Для этого есть специальный запрос "check_authentication" В этом примере используется метод №2, так что mac_key нам не понадобится */ } else { $GoogleAssociationData = $_SESSION['GoogleAssociationData']; } /* Теперь подготовим параметры и переадресуем пользователя на страницу авторизации Google */ $aPrm = array(); $aPrm['openid.ns'] = 'http://specs.openid.net/auth/2.0'; $aPrm['openid.claimed_id'] = 'http://specs.openid.net/auth/2.0/identifier_select'; $aPrm['openid.identity'] = 'http://specs.openid.net/auth/2.0/identifier_select'; $aPrm['openid.mode'] = 'checkid_setup'; // Наш assoc_handle $aPrm['openid.assoc_handle'] = $GoogleAssociationData['assoc_handle']; // URL для callback.php $aPrm['openid.return_to'] = 'http://' . $_SERVER['HTTP_HOST'] . str_replace('request', 'callback', $_SERVER['REQUEST_URI']); // На странице авторизации, рядом с Вашим доменом будет отображаться favicon с Вашего сайта $aPrm['openid.ns.ui'] = 'http://specs.openid.net/extensions/ui/1.0'; $aPrm['openid.ui.icon'] = 'true'; // Перечень того, что мы хотим получить $aPrm['openid.ns.ax'] = 'http://openid.net/srv/ax/1.0'; $aPrm['openid.ax.mode'] = 'fetch_request'; $aPrm['openid.ax.required'] = 'country,email,firstname,lastname,language'; $aPrm['openid.ax.type.country'] = 'http://axschema.org/contact/country/home'; $aPrm['openid.ax.type.email'] = 'http://axschema.org/contact/email'; $aPrm['openid.ax.type.firstname'] = 'http://axschema.org/namePerson/first'; $aPrm['openid.ax.type.lastname'] = 'http://axschema.org/namePerson/last'; $aPrm['openid.ax.type.language'] = 'http://axschema.org/pref/language'; // Переадресовываем header('Location: ' . $GoogleEndPoint . '?' . http_build_query($aPrm)); /* ВНИМАНИЕ ! На странице авторизации Google есть checkbox "Запомнить" Погасите его и по пробуйте сначала с выключенным "запомнить", а потом со включенным. Так будет интереснее */ ?>
Файл callback.php
<?php session_start(); $GoogleAssociationData = $_SESSION['GoogleAssociationData']; function curlRequest ($pUrl, $pParam = array(), $Meth = 'get') { $sRes = ''; $ch = curl_init(); curl_setopt($ch, CURLOPT_HEADER, 0); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); if ($Meth == 'post') { curl_setopt($ch, CURLOPT_POST, 1); curl_setopt($ch, CURLOPT_URL, $pUrl); curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($pParam)); } else { curl_setopt($ch, CURLOPT_URL, $pUrl . '?' . http_build_query($pParam)); } $sRes = curl_exec($ch); curl_close($ch); return $sRes; } echo '<!DOCTYPE HTML><html><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"></head><body>'; if ($_GET['openid_mode'] == 'id_res') { echo '<h3>Пользователь нажал "Да"</h3>'; /* Наш ли это assoc_handle ? */ if ($GoogleAssociationData['assoc_handle'] === $_GET['openid_assoc_handle']) { // Наш // Это URL для запроса "check_authentication" $CheckEndPoint = $_GET['openid_op_endpoint']; /* Готовим параметры и выполняем запрос "check_authentication" */ $aPrm = array(); $aPrm['openid.mode'] = 'check_authentication'; $aPrm['openid.assoc_handle'] = $_GET['openid_assoc_handle']; $aPrm['openid.sig'] = $_GET['openid_sig']; $aPrm['openid.signed'] = $_GET['openid_signed']; $aSigned = explode(',', $_GET['openid_signed']); foreach ($aSigned as $sItem) { $aPrm['openid.' . $sItem] = $_GET['openid_' . str_replace('.', '_', $sItem)]; } $Resp = curlRequest($CheckEndPoint, $aPrm, 'post'); /* Если ответ is_valid:true значит все правильно */ if (preg_match('/.*is_valid:true.*/', $Resp)) { echo '<h3>Аутентичность данных подтверждена</h3>'; echo '<h3>Данные пользователя</h3>'; echo '<p>E-mail: ' . $_GET['openid_ext1_value_email'] . '</p>'; echo '<p>Имя: ' . $_GET['openid_ext1_value_firstname'] . ' ' . $_GET['openid_ext1_value_lastname'] . '</p>'; echo '<p>Язык: ' . $_GET['openid_ext1_value_language'] . '</p>'; } else { echo '<h3>Аутентичность данных не подтверждена</h3>'; } } else { echo '<h3>Не верный (не наш) association handle</h3>'; } } elseif ($_GET['openid_mode'] == 'cancel') { echo '<h3>Пользователь нажал "Нет"</h3>'; } else { echo '<h3>Другой (не Ok) статус: ' . $_GET['openid_mode'] . '</h3>'; } echo '<p><a href="http://alexhpm.rupai.net/googleopenid/request.php">Запустить еще раз</a></p>'; echo '</body></html>'; ?>
Документация от Google находится здесь
Комментариев нет:
Отправить комментарий