function EventOpenid() {
//var_dump($_REQUEST);
require DIR_SERVER_ROOT . '/classes/lib/external/class.openid.php';
if (isset($_SESSION['openid_orig'])) {
$_REQUEST['openid_orig'] = $_SESSION['openid_orig'];
}
if (isset($_REQUEST['openid_mode'])) {
$openid = new SimpleOpenID;
$openid->SetIdentity($_REQUEST['openid_identity']);
$openid_validation_result = $openid->ValidateWithServer();
if ($openid_validation_result == true) { // OK HERE KEY IS VALID
// проверяем автопредложение ника (выдергиваем из openid_identity и проверяем на занятость
if (isset($_REQUEST['openid_op_endpoint']) && $_REQUEST['openid_op_endpoint'] == 'http://openid.yandex.ru/server/') {
$login = str_replace('http://openid.yandex.ru/', '', $_REQUEST['openid_identity']);
$login = str_replace('/', '', $login);
if (!$this->User_GetUserByLogin($login)) {
$_REQUEST['login'] = $login;
}
} else if (isset($_REQUEST['openid_op_endpoint']) && $_REQUEST['openid_op_endpoint'] == 'http://www.myopenid.com/server') {
$login = str_replace('http://', '', $_REQUEST['openid_identity']);
$login = str_replace('.myopenid.com', '', $login);
if (!$this->User_GetUserByLogin($login)) {
$_REQUEST['login'] = $login;
}
} else {
$login = str_replace('http://', '', $_REQUEST['openid_identity']);
if (!$this->User_GetUserByLogin($login)) {
$_REQUEST['login'] = $login;
}
}
// проверяем автопредложение мыла
if ($_REQUEST['openid_sreg_email'] &&
!$this->User_GetUserByMail($_REQUEST['openid_sreg_email'])) {
$_REQUEST['mail'] = $_REQUEST['openid_sreg_email'];
}
$_SESSION['openidInfo']['ident'] = $_REQUEST['openid_identity'];
} else if($openid->IsError() == true) { // ON THE WAY, WE GOT SOME ERROR
$error = $openid->GetError();
echo "ERROR CODE: " . $error['code'] . "
";
echo "ERROR DESCRIPTION: " . $error['description'] . "
";
} else { // Signature Verification Failed
echo "INVALID AUTHORIZATION";
}
} else if (isset($_REQUEST['openid_mode']) && $_REQUEST['openid_mode'] == 'cancel') { // User Canceled your Request
echo "USER CANCELED REQUEST";
}
$bError = false;
if (isset($_REQUEST['submit_openid']) && $_REQUEST['submit_openid']) {
if (!func_check(getRequest('login'),'login',3,30)) {
$this->Message_AddError('Неверный логин, допустим от 3 до 30 символов','Ошибка');
$bError=true;
}
/**
* Проверка мыла
*/
if (!func_check(getRequest('mail'),'mail')) {
$this->Message_AddError('Неверный формат e-mail','Ошибка');
$bError=true;
}
/**
* Проверка капчи(циферки с картинки)
*/
if (!isset($_SESSION['captcha_keystring']) or $_SESSION['captcha_keystring']!=strtolower(getRequest('captcha'))) {
$this->Message_AddError('Неверный код','Ошибка');
$bError=true;
}
/**
* А не занят ли логин?
*/
if ($this->User_GetUserByLogin(getRequest('login'))) {
$this->Message_AddError('Этот логин уже занят','Ошибка');
$bError=true;
}
/**
* А не занято ли мыло?
*/
if ($this->User_GetUserByMail(getRequest('mail'))) {
$this->Message_AddError('Этот емайл уже занят','Ошибка');
$bError=true;
}
if (!$bError) {
/**
* Создаем юзера
*/
$oUser=new UserEntity_User();
$oUser->setLogin(getRequest('login'));
$oUser->setMail(getRequest('mail'));
$oUser->setPassword('oi');
$oUser->setOpenid($_SESSION['openidInfo']['ident']);
$oUser->setDateRegister(date("Y-m-d H:i:s"));
$oUser->setIpRegister(func_getIp());
if (USER_USE_ACTIVATION) {
$oUser->setActivate(0);
$oUser->setActivateKey(md5(func_generator().time()));
} else {
$oUser->setActivate(1);
$oUser->setActivateKey(null);
}
/**
* Регистрируем
*/
if ($this->User_Add($oUser)) {
/**
* Убиваем каптчу
*/
unset($_SESSION['captcha_keystring']);
/**
* Создаем персональный блог
*/
$this->Blog_CreatePersonalBlog($oUser);
/**
* Если юзер зарегистрировался по приглашению то обновляем инвайт
*/
if (USER_USE_INVITE and $oInvite=$this->User_GetInviteByCode($this->GetInviteRegister())) {
$oInvite->setUserToId($oUser->getId());
$oInvite->setDateUsed(date("Y-m-d H:i:s"));
$oInvite->setUsed(1);
$this->User_UpdateInvite($oInvite);
}
/**
* Если стоит регистрация с активацией то проводим её
*/
if (USER_USE_ACTIVATION) {
/**
* Отправляем на мыло письмо о подтверждении регистрации
*/
$this->Notify_SendRegistrationActivate($oUser,getRequest('password'));
func_header_location(DIR_WEB_ROOT.'/registration/confirm/');
} else {
$this->Notify_SendRegistration($oUser,getRequest('password'));
}
// логинимся
$oUser = $this->User_GetUserByOpenid($_SESSION['openidInfo']['ident']);
$this->User_Authorization($oUser);
func_header_location(DIR_WEB_ROOT . '/');
//func_header_location(DIR_WEB_ROOT.'/registration/ok/');
} else {
$this->Message_AddErrorSingle('Возникли технические неполадки при регистрации, пожалуйста повторите регистрацию позже.','Внутреняя ошибка');
return Router::Action('error');
}
}
}
}
В мелоде RegisterEvent дописывам
$this->AddEvent('openid','EventOpenid');
В какое именно место — без разницы )
В ActionLogin::EventLogin() в начало дописываем
require DIR_SERVER_ROOT . '/classes/lib/external/class.openid.php';
if (isset($_REQUEST['openid']) && strlen($_REQUEST['openid']) > 3) {
// очищаем $_REQUEST['openid']: http://shit.example.com/ => shit.example.com
$oid = str_replace('http://', '', trim($_REQUEST['openid']));
if ($oid{strlen($oid) - 1} == '/') {
$oid = substr($oid, 0, strlen($oid) - 1);
}
$openid = new SimpleOpenID;
$openid->SetIdentity($oid);
$openid->SetTrustRoot(DIR_WEB_ROOT . '');
$openid->SetRequiredFields(array('email','fullname'));
$openid->SetOptionalFields(array('dob','gender','postcode','country','language','timezone'));
if ($openid->GetOpenIDServer()){
$oi = $openid->GetIdentity();
//$oUser = $this->User_GetUserByOpenid($oi);
//var_dump($oUser);
if ($oUser = $this->User_GetUserByOpenid($oi)) {
$this->User_Authorization($oUser);
if (isset($_SERVER['HTTP_REFERER'])) {
$sBackUrl=$_SERVER['HTTP_REFERER'];
if (strpos($sBackUrl,DIR_WEB_ROOT.'/login')===false) {
func_header_location($sBackUrl);
}
}
func_header_location(DIR_WEB_ROOT . '/');
} else {
$_SESSION['openid_orig'] = $oid;
$openid->SetApprovedURL(DIR_WEB_ROOT . '/registration/openid');
$openid->Redirect();
}
}else{
$error = $openid->GetError();
$this->Message_AddError($error['description'],'Ошибка');
}
} else if (isset($_REQUEST['openid_mode'])) {
$openid = new SimpleOpenID;
$openid->SetIdentity($_REQUEST['openid_identity']);
$openid_validation_result = $openid->ValidateWithServer();
if ($openid_validation_result == true) { // OK HERE KEY IS VALID
} else if($openid->IsError() == true) { // ON THE WAY, WE GOT SOME ERROR
$error = $openid->GetError();
echo "ERROR CODE: " . $error['code'] . "
";
echo "ERROR DESCRIPTION: " . $error['description'] . "
";
$this->Message_AddError($error['description'],'Ошибка');
} else { // Signature Verification Failed
echo "INVALID AUTHORIZATION";
}
} else if (isset($_REQUEST['openid_mode']) && $_REQUEST['openid_mode'] == 'cancel') { // User Canceled your Request
echo "USER CANCELED REQUEST";
}
Дальше идет строчка «if (isset($_REQUEST['submit_login']) && !$this->User_IsAuthorization()) {» — не помню менял её или нет.
Теперь правим модельку юзера
В файле
classes/modules/user/User.class.php
добавляем метод
public function GetUserByOpenid($sOpenid) {
$data = $this->oMapper->GetUserByOpenid($sOpenid);
return $data;
}
В
classes/modules/user/mapper/User.mapper.class.php
дописываем
public function GetUserByOpenid($sKey) {
$sql = "SELECT
u.*,
IF(ua.user_id IS NULL,0,1) as user_is_administrator
FROM
".DB_TABLE_USER." as u
LEFT JOIN ".DB_TABLE_USER_ADMINISTRATOR." AS ua ON u.user_id=ua.user_id
WHERE
u.user_openid = ? ";
if ($aRow=$this->oDb->selectRow($sql,$sKey)) {
return new UserEntity_User($aRow);
}
return null;
}
32 комментария
Спасибо, нужная вещь, обязательно после нового года прикручу и попробую.
Единственные минусы в твоей работе, что многие комментарии и сообщения об ошибках пишутся на английском.
OpenID яндексовый какой-то особенный — пробовал прикрутить опенид к ЖУ тоже, дак используемая библиотека работала со всеми имеющимися провайдерами, кроме яндекса.
я вспомнил: в одном из подкастов, где участвуют яндексовые сотрудники, их зам. начальника отдела разработки коммуникационных сервисов говорил, что они наконец-то починили ОпенИд и он со всеми нормально стал работать.
Подскажите пжл.
Вот прикрутили опенид к сайту.
Ввожу логин(жж), на сайте соглашаюсь довериться серверу, регистрируюсь
всё замечательно работает, но если любой человек с любого компа в авторизации опенид у меня на сайте введет мой жж, то также прекрасно авторизуется.
Может я чего не понимаю, но я представлял себе опенид так:
Браузер, если в окне авторизован в жж(например) или любой системе опенид, то в соседнем окне ты прекрасно авторизуешься по ссылке опенид(ник.livejournal.com)
Если ты в жж неавторизован, то при вводе на сайте опенид логина(ник.livejournal.com) тебя перебрасывает на жж и говорит сначала авторизоваться там.
ОпенИд должен так работать или нет?
и тебе привет ), да скорее всего я так уже и понял старенький хак.., ищу реализацию на новую версию
на хабре пост увидел habrahabr.ru/blogs/webdev/67774/
там показана реализация на другом сайте и другом движке, вполне неплохая вещь… )
Ошибка после ввода openid. Потом подтверждение и переходит на сайт с 404 ошибкой. Авторизация в итоге не произведена.
Notice: Undefined offset: 0 in Z:\home\***.su\www\classes\lib\external\class.openid.php on line 245
[Денвер: показать возможную причину ошибки]
Notice: Undefined variable: query in Z:\home\***.su\www\classes\lib\external\class.openid.php on line 175
Насколько я знаю, есть штука наподобие OpenID от ВКонтакте. Только сайты, с этим работающие, должны быть одобрены самим ВКонтакте. Вот сайт: userapi.com
Open API — система для разработчиков сторонних сайтов, которая предоставляет им возможность авторизовывать пользователей ВКонтакте на своих сайтах и с их согласия пользователей получать доступ к их информации, друзьям, фотографиям, аудиозаписям, видеороликам, объявлениям и др.
В рамках подключения Вашего сайта к Open API создается приложение, которое будет иметь доступ ко всем текущим методам ВКонтакте API непосредственно на Вашем сайте. Помимо этого Open API предоставляет возможность упростить процесс регистрации новых пользователей на Вашем сайте, если у них уже есть учетная запись ВКонтакте.
32 комментария
Единственные минусы в твоей работе, что многие комментарии и сообщения об ошибках пишутся на английском.
решаем эту проблему. че-то не ставится
echo "ERROR CODE: " — такие ошибки не разу не появлялись у меня в процессе тестирования
из $_REQUEST[] брать чтолибо опасно — мало ли что нам туда подсунули — в апи ядра двигательного есть функция getRequest().
Просветите меня, OpenID яндекса не работает в ЖЖ и наоборот, или не так?
OpenID яндексовый какой-то особенный — пробовал прикрутить опенид к ЖУ тоже, дак используемая библиотека работала со всеми имеющимися провайдерами, кроме яндекса.
а было это не больше месяца назад
Вот прикрутили опенид к сайту.
Ввожу логин(жж), на сайте соглашаюсь довериться серверу, регистрируюсь
всё замечательно работает, но если любой человек с любого компа в авторизации опенид у меня на сайте введет мой жж, то также прекрасно авторизуется.
Может я чего не понимаю, но я представлял себе опенид так:
Браузер, если в окне авторизован в жж(например) или любой системе опенид, то в соседнем окне ты прекрасно авторизуешься по ссылке опенид(ник.livejournal.com)
Если ты в жж неавторизован, то при вводе на сайте опенид логина(ник.livejournal.com) тебя перебрасывает на жж и говорит сначала авторизоваться там.
ОпенИд должен так работать или нет?
Однозначно в фаворитс.
Наверняка проблема в том, что хак актуален для 0,2-ой версии, а пытаетесь ставить на 0,3.
на хабре пост увидел
там показана реализация на другом сайте и другом движке, вполне неплохая вещь… )
**** логин
*** домен
Там все достаточно просто… щас нет ни времени ни желания этим заниматься, плюс у меня появилась аллергия на php, вобщем удачи!
сарказм?
userapi.com, durov.ru, vk.ru и vkontakte.ru — все они из одной «ВКонтактовской» «секты» :)
Open API — система для разработчиков сторонних сайтов, которая предоставляет им возможность авторизовывать пользователей ВКонтакте на своих сайтах и с их согласия пользователей получать доступ к их информации, друзьям, фотографиям, аудиозаписям, видеороликам, объявлениям и др.
В рамках подключения Вашего сайта к Open API создается приложение, которое будет иметь доступ ко всем текущим методам ВКонтакте API непосредственно на Вашем сайте. Помимо этого Open API предоставляет возможность упростить процесс регистрации новых пользователей на Вашем сайте, если у них уже есть учетная запись ВКонтакте.