@newbieman

Как получить и записать данные с соц сетей с помощью eauth yii2 при регистрации?

Делал по тутору регистрацию.

Там не указано как получить данные при вхождении у пользователя и их запись в базу данных. Ну и создание нового юзера.
  • Вопрос задан
  • 3063 просмотра
Решения вопроса 1
sanchezzzhak
@sanchezzzhak
Ля ля ля...
public function actions()
	{
		return [
			'social' => [
				'class' => 'yii\authclient\AuthAction',
				'successCallback' => [$this, 'successCallback'],
			],
		];
	}


/**
	 * @param $client
	 */
	public function successCallback($client)
	{
        $day = 86400;
		$client_id = Yii::$app->request->get('authclient');
		$attributes = $client->getUserAttributes();

		$email = '';
        $sex   = 0;
        // VK
		if($client instanceof VKontakte)
		{
			$auth_params = $client->getAccessToken()->getParams();
			$email = ArrayHelper::getValue($auth_params,'email','');
            // Аватарка из соц сети
            $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);
                Yii::$app->session->setFlash('social_avatar', $vk_data['photo_max_orig']);
            }
		}

        if($client instanceof YandexOAuth)
        {
            $ya_data_response = $client->api('info','GET',['format'=>'json']);
            $email = array_shift($ya_data_response['emails']);

            Yii::$app->session->setFlash('social_avatar', "https://avatars.yandex.net/get-yapic/{$ya_data_response['default_avatar_id']}/islands");

            if(!empty($ya_data_response['sex']))
            {
                $sex = $ya_data_response['sex'] == 'female' ? UserProfile::SEX_FEMALE : UserProfile::SEX_MALE;
            }
        }

        if($client instanceof Odnoklassniki)
        {
            $od_data_response =$client->api('','GET',[
                'method' => 'users.getCurrentUser',
                'application_key' => $client->application_public_key
            ]);
            $sex = $od_data_response['gender'] == 'female' ? UserProfile::SEX_FEMALE : UserProfile::SEX_MALE;
            if(isset($od_data_response['pic_1']))
            {
                Yii::$app->session->setFlash('social_avatar', $od_data_response['pic_1']);
            }
         }

        if($client instanceof Facebook) {
            try
            {
                $curl = new Curl;
                $fb_curl_result = $curl->get("https://graph.facebook.com/{$attributes['id']}/picture?width=300&redirect=false");
                $fb_data_responce = Json::decode($fb_curl_result);
                if (isset($fb_data_responce['data'])) {
                    Yii::$app->session->setFlash('social_avatar', $fb_data_responce['data']['url']);
                }

            }
            catch (Exception $e) {};
        }

		$user_social = UserSocial::findOne([
			'client' => $client_id ,
			'internal_id' => $attributes['id']
		]);

		if(!$user_social)
		{
			$user = new User;
			if(!empty($email) && !$user = User::find()->where(['email'=>$email])->one())
			{
				$user = new User;
				$user->email = $email;
			}
			// тут я шаманил у меня соц пользователи не имеют логина и пароля через валидатор авторизации они не пройдут так как пустые.
			$user->scenario = 'social';
			if($user->isNewRecord)
			{
				$user->username = '';
				$user->password_hash = '';
			}
			
			// регистрируем в User
			if($user->register())
			{
				$user_social = new UserSocial;
				$user_social->user_id = $user->id;
				$user_social->client = $client_id;
				$user_social->internal_id = (string)$attributes['id'];
				$user_social->save();

				
				// $this->referralRegistration($user->id);
			}

            //$this->setSocialAvatarToProfile($user->id);
				

			Yii::$app->session->set('auth_social',[
				'client' => $client_id,
				'attributes' => $attributes,
				'token' => ''
			]);
		}
		
		$user = $user_social->user;
		Yii::$app->user->login($user , $day * 366);
	}
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы