/** * Signs user up. * * @return User|null the saved model or null if saving fails */ public function signup() { if ($this->validate()) { $user = new User(); $user->username = $this->username; $user->email = $this->email; $user->setPassword($this->password); $user->generateAuthKey(); // Если необходима активация email адресов if (Yii::$app->params['emailActivation'] == true) { $user->status = $user::STATUS_NOT_ACTIVE; } $transaction = Yii::$app->db->beginTransaction(); if ($r = $user->save()) { $profile = new UserProfile(); $profile->user_id = $user->id; if ($profile->save()) { $transaction->commit(); // Генерируем токен для подтверждения email $user->generateEmailConfirmToken(); // Сохраняем его в базе $user->save(); // Отправляем письмо $user->sendEmailConfirm(); return $user; } else { $transaction->rollBack(); } } else { $transaction->rollBack(); } } return null; }
/** * Регистрирует последний визит в профиле пользователя * @param $user_id */ public static function registerLastVisit($user_id) { $profile = UserProfile::findOne($user_id); $profile->last_visit = time(); $profile->last_ip = Yii::$app->request->getUserIP(); $profile->save(); }
/** * CallBack метод для oAuth авторизации через внешние сервисы * * @param $client * @throws BadRequestHttpException * @throws \yii\base\Exception * @throws \yii\db\Exception */ public function onAuthSuccess($client) { $attributes = $client->getUserAttributes(); // VK if ($client instanceof \yii\authclient\clients\VKontakte) { $auth_params = $client->getAccessToken()->getParams(); $email = ArrayHelper::getValue($auth_params, 'email', ''); // Аватарка из VK да ПОБОЛЬШЕ!!! $vk_data_response = $client->api('users.get', 'POST', ['uids' => $attributes['id'], 'fields' => 'photo_max_orig']); if ($vk_data_response = ArrayHelper::getValue($vk_data_response, 'response', false)) { $vk_data = array_shift($vk_data_response); } $userInfo['source_id'] = $attributes['id']; $userInfo['username'] = $attributes['screen_name'] ? $attributes['screen_name'] : GlobalHelper::usernameFromEmail($attributes['email']); $userInfo['email'] = $attributes['email']; $userInfo['name'] = $attributes['first_name']; $userInfo['surname'] = $attributes['last_name']; $userInfo['birth_date'] = date('Y-m-d', strtotime($attributes['bdate'])); $userInfo['sex'] = $attributes['sex'] == 2 ? 'm' : 'f'; } // YANDEX if ($client instanceof \yii\authclient\clients\YandexOAuth) { $userInfo['source_id'] = $attributes['id']; $userInfo['username'] = $attributes['login'] ? $attributes['login'] : GlobalHelper::usernameFromEmail($attributes['emails'][0]); $userInfo['email'] = $attributes['emails'][0]; $userInfo['name'] = $attributes['first_name']; $userInfo['surname'] = $attributes['last_name']; $userInfo['birth_date'] = $attributes['birthday']; $userInfo['sex'] = $attributes['sex'] == 'male' ? 'm' : 'f'; } // FACEBOOK if ($client instanceof \yii\authclient\clients\Facebook) { //var_dump($attributes); die(); $userInfo['source_id'] = $attributes['id']; $userInfo['username'] = GlobalHelper::usernameFromEmail($attributes['email']); $userInfo['email'] = $attributes['email']; $userInfo['name'] = $attributes['name']; $userInfo['surname'] = ''; $userInfo['birth_date'] = ''; $userInfo['sex'] = ''; } // GOOGLE if ($client instanceof \yii\authclient\clients\GoogleOAuth) { //var_dump($attributes); die(); $userInfo['source_id'] = $attributes['id']; $userInfo['username'] = GlobalHelper::usernameFromEmail($attributes['emails'][0]["value"]); $userInfo['email'] = $attributes['emails'][0]["value"]; $userInfo['name'] = $attributes['name']["givenName"]; $userInfo['surname'] = $attributes['name']["familyName"]; $userInfo['birth_date'] = ''; $userInfo['sex'] = $attributes['gender'] == 'male' ? 'm' : 'f'; } // MAIL.RU if ($client instanceof \frontend\components\auth\Mailru) { //var_dump($attributes[0]); die(); $userInfo['source_id'] = $attributes['id']; $userInfo['username'] = GlobalHelper::usernameFromEmail($attributes[0]['email']); $userInfo['email'] = $attributes[0]["email"]; $userInfo['name'] = $attributes[0]["first_name"]; $userInfo['surname'] = $attributes[0]["last_name"]; $userInfo['birth_date'] = date('Y-m-d', strtotime($attributes[0]["birthday"])); $userInfo['sex'] = $attributes[0]["sex"] == 0 ? 'm' : 'f'; } /*// ODNOKLASSNIKI if($client instanceof \frontend\components\auth\Odnoklassniki) { var_dump($attributes); die(); $userInfo['source_id'] = $attributes['uid']; $userInfo['username'] = GlobalHelper::usernameFromEmail($attributes[0]['email']); if($attributes['has_email']) $userInfo['email'] = $attributes[0]["email"]; $userInfo['name'] = $attributes["first_name"]; $userInfo['surname'] = $attributes["last_name"]; $userInfo['birth_date'] = $attributes["birthday"]; $userInfo['sex'] = ($attributes["gender"] == 'male') ? 'm' : 'f'; }*/ if (!isset($userInfo['email']) || empty($userInfo['email'])) { throw new BadRequestHttpException('Не удалось получить email адрес'); } /* @var $auth Auth */ $auth = Auth::find()->where(['source' => $client->getId(), 'source_id' => $attributes['id']])->one(); if (Yii::$app->user->isGuest) { if ($auth) { // авторизация $user = $auth->user; Yii::$app->user->login($user); Yii::$app->session->setFlash('success', 'Вход произведен. Теперь вы можете использовать все дополнительные возможности сайта.'); } else { // регистрация if (isset($userInfo['email']) && User::find()->where(['email' => $userInfo['email']])->exists()) { Yii::$app->getSession()->setFlash('error', [Yii::t('app', "Пользователь с электронной почтой как в <strong>{client} (" . $userInfo['email'] . ")</strong> уже существует, но не связан с этим аккаунтом. Вероятно, вы уже регистрировались на нашем сайте с помощью другой социальной сети, к которой привязан email <strong>" . $userInfo['email'] . "</strong>, или с использованием классического способа регистрации.\n Для входа на сайт используйте тот сервис, который вы использовали в первый раз. Если это невозможно, перейдите <a href='/site/request-password-reset'>на эту страницу</a> и пройдите процедуру восстановления доступа, указав email <strong>" . $userInfo['email'] . "</strong>. На этот адрес будет отправлено письмо с дальнейшими действиями. После восстановления доступа вы сможете привязать\n к своему аккаунту любую из социальных сетей и далее входить на сайт в один клик.", ['client' => $client->getTitle()])]); } else { $password = Yii::$app->security->generateRandomString(6); $user = new User(['username' => $userInfo['username'], 'email' => $userInfo['email'], 'password' => $password]); $user->generateAuthKey(); $user->generatePasswordResetToken(); $transaction = $user->getDb()->beginTransaction(); if ($user->save()) { $profile = new UserProfile(); $profile->user_id = $user->id; $profile->name = $userInfo['name']; $profile->surname = $userInfo['surname']; $profile->birth_date = $userInfo['birth_date']; if (isset($userInfo['sex'])) { $profile->sex = $userInfo['sex']; } $profile->save(); $auth = new Auth(['user_id' => $user->id, 'source' => $client->getId(), 'source_id' => (string) $userInfo['source_id']]); if ($auth->save()) { $transaction->commit(); Yii::$app->session->setFlash('success', 'Вход на сайт произведен. Для вас была автоматически создана учетная запись. Информация о ней отправлена на ваш email (<strong>(' . $userInfo['email'] . ')</strong>). В дальнейшем вы можете входить на сайт как с помощью {client}, так и с помощью своего логина и пароля.'); Yii::$app->user->login($user); } else { print_r($auth->getErrors()); } } else { print_r($user->getErrors()); } } } } else { // Пользователь уже зарегистрирован if ($auth->user_id != Yii::$app->user->getId()) { // Если аккаунт привязан к другому пользователю Yii::$app->session->setFlash('error', 'Данный аккаунт ' . $client->getTitle() . ' привязан к учетной записи другого пользователя сайта. Привязать аккаунт к двум учетным записям невозможно.'); } else { Yii::$app->session->setFlash('info', 'Данный аккаунт ' . $client->getTitle() . ' уже привязан к вашей учетной записи.'); } if (!$auth) { // добавляем внешний сервис аутентификации $auth = new Auth(['user_id' => Yii::$app->user->id, 'source' => $client->getId(), 'source_id' => $attributes['id']]); $auth->save(); } } }