Exemplo n.º 1
0
 public static function clientUser(BaseOAuth $client)
 {
     $attributes = ['name' => $client->getName(), 'service_id' => $client->id];
     /**
      * @var self $model
      */
     if (!($model = self::findOne($attributes))) {
         $model = new self(array_merge($attributes, ['created_at' => time(), 'data' => json_encode($client->getUserAttributes())]));
         $model->save(false);
         $user = new User(['username' => $model->name . $model->id, 'status' => User::STATUS_ACTIVE]);
         $user->save(false);
         $model->updateAttributes(['user_id' => $user->id]);
         return $user;
     }
     return $model->user;
 }
Exemplo n.º 2
0
 /**
  *
  * @param BaseOAuth $client
  */
 public function successCallback($client)
 {
     $tokenParams = $client->getAccessToken()->getParams();
     $attributes = $client->getUserAttributes();
     if ($attributes['state'] == 'err') {
         throw new NotFoundHttpException($attributes['desc']);
     }
     $user = new User();
     $user->id = 'userdata';
     $user->userData = $attributes['customer'];
     $user->accessToken = $tokenParams['access_token'];
     $user->refreshToken = $tokenParams['refresh_token'];
     $user->authKey = time() . rand(10000, 99999);
     $user->save();
     Yii::$app->user->login($user, $tokenParams['expires_in']);
 }
Exemplo n.º 3
0
 public static function clientUser(BaseOAuth $client)
 {
     $attributes = ['name' => $client->getName(), 'service_id' => $client->id];
     /**
      * @var static $model
      */
     if (!($model = static::findOne($attributes))) {
         $model = new static(array_merge($attributes, ['created_at' => time(), 'data' => json_encode($client->getUserAttributes())]));
         $model->save(false);
         /** @var User $userClass */
         $userClass = User::childClass();
         /** @var User $user */
         $user = new $userClass(['username' => $model->name . '_' . $model->id, 'email' => $model->name . '_' . $model->id, 'status' => $userClass::STATUS_ACTIVE]);
         $user->save(false);
         $model->updateAttributes(['user_id' => $user->id]);
         return $user;
     }
     return $model->user;
 }
Exemplo n.º 4
0
 /**
  * @param BaseOAuth $client
  * @throws \yii\db\Exception
  */
 public function onAuthSuccess($client)
 {
     \Yii::info('start auth client: ' . $client->getId(), 'authClient');
     $attributes = $client->getUserAttributes();
     /* @var $userAuthClient UserAuthClient */
     $userAuthClient = UserAuthClient::find()->where(['provider' => $client->getId(), 'provider_identifier' => ArrayHelper::getValue($attributes, 'id')])->one();
     if (\Yii::$app->user->isGuest) {
         if ($userAuthClient) {
             // Все просто идет авторизация
             $userAuthClient->provider_data = $attributes;
             $userAuthClient->save();
             $user = $userAuthClient->user;
             \Yii::$app->user->login($user);
         } else {
             // Регистрация
             /**
              * @var $user User
              */
             $user = null;
             //Если соц сеть вернула нам email то на него можно опираться.
             if ($emailFromAuthClient = ArrayHelper::getValue($attributes, 'email')) {
                 //Нашли email
                 $userEmailModel = CmsUserEmail::find()->where(['value' => $emailFromAuthClient])->one();
                 if ($userEmailModel) {
                     if ($userEmailModel->user) {
                         $user = $userEmailModel->user;
                     }
                 }
             }
             if (!$user) {
                 $userClassName = \Yii::$app->cms->getUserClassName();
                 $user = new $userClassName();
                 $user->populate();
                 if (!$user->save()) {
                     \Yii::error("Не удалось создать пользователя: " . serialize($user->getErrors()), 'authClient');
                     return false;
                 }
                 //Тут можно обновить данные пользователя.
                 if ($login = ArrayHelper::getValue($attributes, 'screen_name')) {
                     $user->username = $login;
                     if (!$user->save()) {
                         \Yii::error("Не удалось обновить данные пользователя: " . serialize($user->getErrors()), 'authClient');
                     }
                 }
                 //Тут можно обновить данные пользователя.
                 if ($login = ArrayHelper::getValue($attributes, 'login')) {
                     $user->username = $login;
                     if (!$user->save()) {
                         \Yii::error("Не удалось обновить данные пользователя: " . serialize($user->getErrors()), 'authClient');
                     }
                 }
                 if ($email = ArrayHelper::getValue($attributes, 'email')) {
                     $user->email = $email;
                     if (!$user->save()) {
                         \Yii::error("Не удалось обновить данные пользователя: " . serialize($user->getErrors()), 'authClient');
                     }
                 }
                 if ($name = ArrayHelper::getValue($attributes, 'name')) {
                     $user->name = $name;
                     if (!$user->save()) {
                         \Yii::error("Не удалось обновить данные пользователя: " . serialize($user->getErrors()), 'authClient');
                     }
                 }
                 $firstName = ArrayHelper::getValue($attributes, 'first_name');
                 $lastName = ArrayHelper::getValue($attributes, 'last_name');
                 if ($firstName || $lastName) {
                     $user->name = $lastName . " " . $firstName;
                     if (!$user->save()) {
                         \Yii::error("Не удалось обновить данные пользователя: " . serialize($user->getErrors()), 'authClient');
                     }
                 }
             }
             //$transaction = $user->getDb()->beginTransaction();
             $auth = new UserAuthClient(['user_id' => $user->id, 'provider' => $client->getId(), 'provider_identifier' => (string) $attributes['id'], 'provider_data' => $attributes]);
             if ($auth->save()) {
                 //$transaction->commit();
                 Yii::$app->user->login($user);
                 if (!$user->image) {
                     try {
                         if ($photoUrl = ArrayHelper::getValue($attributes, 'photo')) {
                             $file = \Yii::$app->storage->upload($photoUrl, ['name' => $user->name]);
                             $user->link('image', $file);
                         }
                     } catch (\Exception $e) {
                     }
                 }
                 if (!$user->image) {
                     try {
                         if ($photoUrl = ArrayHelper::getValue($attributes, 'avatar_url')) {
                             $file = \Yii::$app->storage->upload($photoUrl, ['name' => $user->name]);
                             $user->link('image', $file);
                         }
                     } catch (\Exception $e) {
                     }
                 }
             } else {
                 \Yii::error("Не удалось создать социальный профиль: " . serialize($auth->getErrors()), 'authClient');
             }
         }
     } else {
         // user already logged in
         if (!$userAuthClient) {
             // add auth provider
             $userAuthClient = new UserAuthClient(['user_id' => \Yii::$app->user->identity->id, 'provider' => $client->getId(), 'provider_identifier' => (string) $attributes['id'], 'provider_data' => $attributes]);
             if (!$userAuthClient->save()) {
                 print_r($userAuthClient->getErrors());
                 die('no');
             }
         } else {
             $userAuthClient->provider_data = $attributes;
             $userAuthClient->save();
         }
     }
 }