Example #1
0
 /**
  * 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;
 }
Example #2
0
 /**
  * Регистрирует последний визит в профиле пользователя
  * @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();
 }
Example #3
0
 /**
  * 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();
         }
     }
 }