Использование yii2-eauth модуля на примере Facebook

Столкнулся с проблемой испозьвования модуля yii2-eauth для Yii2 Framework, и что бы эти проблемы не решали вы я опишу как же испозьвовать этот модуль.

Для начала установим модуль следующим образом:

Отредактируйте файл composer.json добавив в него следуюющее


{
    "require": {
        "nodge/yii2-eauth": "~2.0"
    }
}

В папке Yii проекта запустите слудующую команду(если у вас установлен composer):


composer update;

Добавте следующее в ваш файл конфигураций:


'components' => [
        'eauth' => [
            'class' => 'nodge\eauth\EAuth',
            'popup' => true, // Use the popup window instead of redirecting.
            'cache' => false, // Cache component name or false to disable cache. Defaults to 'cache' on production environments.
            'cacheExpire' => 0, // Cache lifetime. Defaults to 0 - means unlimited.
            'httpClient' => [
                // uncomment this to use streams in safe_mode
                //'useStreamsFallback' => true,
            ],
            'services' => [ 
                'facebook' => [
                    // register your app here: https://developers.facebook.com/apps/
                    'class' => 'nodge\eauth\services\FacebookOAuth2Service',
                    'clientId' => 'your_facebook_app_id',
                    'clientSecret' => 'your_facebook_app_secret',
                ],
           ],
],

Измените вашу модель User для того, чтобы использовать EAuth следующим образом


    public $profile;
    public $authKey;
    
    
    /**
     * @inheritdoc
     */
    public static function findIdentity($id)
    {
        if (Yii::$app->getSession()->has('user-'.$id)) {
            return new self(Yii::$app->getSession()->get('user-'.$id));
        }
        else {
            return self::findOne($id);
        }
    }

    /**
     * @param \nodge\eauth\ServiceBase $service
     * @return User
     * @throws ErrorException
     */
    public static function findByEAuth($service) {
    	if (!$service->getIsAuthenticated()) {
    		throw new ErrorException('EAuth user should be authenticated before creating identity.');
    	}
    
    	$id = $service->getServiceName().'-'.$service->getId();
    	$attributes = array(
    			'id' => $id,
    			'username' => $service->getAttribute('name'),
    			'authKey' => md5($id),
    			'profile' => $service->getAttributes(),
    	);
    	$attributes['profile']['service'] = $service->getServiceName();
    	Yii::$app->getSession()->set('user-'.$id, $attributes);
    	return new self($attributes);
    }

Добавте OpenId контролер для того, чтобы отключить CSRF валидацию для OpenId callbacks. Или отключите CSRF самостоятельно.


    public function behaviors() {
            return array(
                'eauth' => array(
                    // required to disable csrf validation on OpenID requests
                    'class' => \nodge\eauth\openid\ControllerBehavior::className(),
                    'only' => array('login'),
                ),
            );
        }

Добавте следующее до функции входа


public function actionLogin()
 {    	  
    	  $serviceName = Yii::$app->getRequest()->getQueryParam('service');
    	  if (isset($serviceName)) {
    	  	/** @var $eauth \nodge\eauth\ServiceBase */
    	  	$eauth = Yii::$app->get('eauth')->getIdentity($serviceName);
    	  	$eauth->setRedirectUrl(Yii::$app->getUser()->getReturnUrl());
    	  	$cancelUrl = str_replace('//', '/', Yii::$app->getUrlManager()->createAbsoluteUrl('site/login'));
    	  	$cancelUrl = str_replace(':/', '://', $cancelUrl);
    	  	$eauth->setCancelUrl($cancelUrl);
    	  	try {
    	  		if ($eauth->authenticate()) {
    	  			$identity = User::findByEAuth($eauth);
    	  			
    	  			Yii::$app->getUser()->login($identity);
    	  
    	  			// special redirect with closing popup window
    	  			$eauth->redirect();
    	  		}
    	  		else {
    	  			// close popup window and redirect to cancelUrl
    	  			$eauth->cancel();
    	  		}
    	  	}
    	  	catch (\nodge\eauth\ErrorException $e) {
    	  		// save error to show it later
    	  		Yii::$app->getSession()->setFlash('error', 'EAuthException: '.$e->getMessage());
    	  
    	  		// close popup window and redirect to cancelUrl
    	  		//              $eauth->cancel();
    	  		$eauth->redirect($eauth->getCancelUrl());
    	  	}
    	  }
    	  
        if (!\Yii::$app->user->isGuest) {
            return $this->goHome();
        }

        $model = new LoginForm();
        if ($model->load(Yii::$app->request->post()) ) {
            if ($model->login()) {
                return $this->goBack();
            }
        } else {
            return $this->render('login', [
                'model' => $model,
            ]);
        }
    }

Добавте эти строки в View для входа


<?php
 if (Yii::$app->getSession()->hasFlash('error')) {
    echo '<div class="alert alert-danger">'.Yii::$app->getSession()->getFlash('error').'</div>';
}
?>
<?php echo Widget::widget(['action' => 'site/login']); ?>

Ошибки

Ну и если у вас при работе с Facebook Api возникает такая ошибка:


EAuthException: Error in retrieving token: "100: Error validating verification code. Please make sure your redirect_uri is identical to the one you used in the OAuth dialog request"

тогда вам нужно убрать все дублирующие слэши redirect_uri или же добавить слэш в конец redirect_uri

Тема: 
LikeMe: