Yii Auth и явная регистрация

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
german.igortcev
Сообщения: 251
Зарегистрирован: 2014.08.18, 14:01

Yii Auth и явная регистрация

Сообщение german.igortcev »

Приветствую всех. Пожаловал к Вам с вопросом.

Пользователь входит через соц сеть, я делаю связку с обычной учеткой или отправляю на регистрацию для дополнения данных.

Код: Выделить всё

public function successCallback($client)
    {
        
        $attributes = $client->getUserAttributes();
        
        $id = $attributes['id'];
        $service = $attributes['service'];
        
        $record = \app\models\Social::findOne(['identity' => $id, 'service' => $service]);
        //Пользователь существует
        if($record){
            
        }  else {
            //Пользователь впервые
            $social = new \app\models\Social();
            $social->identity = $id;
            $social->service = $service;
            
            $signup = new SignupForm;
            $signup->username = $attributes['displayName'];
            
            $this->render('signup', ['model' => $signup, 'social' => $social]);
            
        }
Перенаправляет на главную, по моей логике в голове должен перенаправлять на Signup и подставить значение в username.
Аватара пользователя
anton44eg
Сообщения: 2716
Зарегистрирован: 2012.01.25, 13:37
Откуда: Киев

Re: Yii Auth и явная регистрация

Сообщение anton44eg »

Код: Выделить всё

return $this->render('signup', ['model' => $signup, 'social' => $social]); 
german.igortcev
Сообщения: 251
Зарегистрирован: 2014.08.18, 14:01

Re: Yii Auth и явная регистрация

Сообщение german.igortcev »

Аналогично. Не работает, перенаправляет на главную.
zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

Re: Yii Auth и явная регистрация

Сообщение zelenin »

продебажьте
german.igortcev
Сообщения: 251
Зарегистрирован: 2014.08.18, 14:01

Re: Yii Auth и явная регистрация

Сообщение german.igortcev »

zelenin писал(а):продебажьте
почти нечего, поэту и спрашиваю.
zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

Re: Yii Auth и явная регистрация

Сообщение zelenin »

german.igortcev писал(а):
zelenin писал(а):продебажьте
почти нечего, поэту и спрашиваю.
в смысле нечего? вам редиректит на индекс, а у вас signup. Такого не может быть.
Аватара пользователя
anton44eg
Сообщения: 2716
Зарегистрирован: 2012.01.25, 13:37
Откуда: Киев

Re: Yii Auth и явная регистрация

Сообщение anton44eg »

имелось ввиду - подключитесь xdebug-ом и посмотрите где происзодит редирект
german.igortcev
Сообщения: 251
Зарегистрирован: 2014.08.18, 14:01

Re: Yii Auth и явная регистрация

Сообщение german.igortcev »

Пробежался через отладку, ничего космического не нашел. (Особого опыта нет в этих делах, никогда не сталкивался и обходился дампером)

Вообще ситуация такая, на signup попадаю и после мгновенный редирект. Получается что Signup Action в самом начале делаю exit() но все равно его проскакивает и открывает главную.
zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

Re: Yii Auth и явная регистрация

Сообщение zelenin »

сказки.
Аватара пользователя
Faenir
Сообщения: 292
Зарегистрирован: 2010.01.06, 01:46
Откуда: Симферополь

Re: Yii Auth и явная регистрация

Сообщение Faenir »

german.igortcev писал(а):Пробежался через отладку, ничего космического не нашел. (Особого опыта нет в этих делах, никогда не сталкивался и обходился дампером)

Вообще ситуация такая, на signup попадаю и после мгновенный редирект. Получается что Signup Action в самом начале делаю exit() но все равно его проскакивает и открывает главную.
Что за Signup Action? Вижу successCallback, вижу рендер вьюшки 'signup'. actionSignup() - не вижу... покажите его. Нужно боольше кода...
zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

Re: Yii Auth и явная регистрация

Сообщение zelenin »

да зачем actionSignup вообще нужен? он не фигурирует вообще.
Аватара пользователя
VaNnOrus
Сообщения: 96
Зарегистрирован: 2014.10.09, 12:50

Re: Yii Auth и явная регистрация

Сообщение VaNnOrus »

zelenin писал(а):да зачем actionSignup вообще нужен? он не фигурирует вообще.
Быть может потому, что:
german.igortcev писал(а):...на signup попадаю и после мгновенный редирект...
Не?
zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

Re: Yii Auth и явная регистрация

Сообщение zelenin »

не, не поможет. автор не может продебажить свой код, а то, что он показал явно недостаточно.
german.igortcev
Сообщения: 251
Зарегистрирован: 2014.08.18, 14:01

Re: Yii Auth и явная регистрация

Сообщение german.igortcev »

Хорошо. Начну с самого начала.

Я делаю авторизацию через соц сети. Мне нужна явная регистрация обычного пользователя где информация полученная из соц сети будет дополнять профиль пользователя. Хочу обойтись расширением из коробки.

Из документации я понял, что при успешной авторизации вызывается метод successCallback в котором мы производим нужные нам манипуляции.

В моем случае я хочу получить от соц сети следующие данные: id(уникальный соц сети) service (имя сервиса через который прошла авторизация $this->getTitle()) и displayName.

В successCallback я создаю экземпляр модели SignupForm и присваиваю displayName. И все это мне нужно передать в представление.

Я вызываю метод render и передаю экцемпляры моделей Social (id, service, user_id) и SignupForm.

Итог - меня перенаправляет на главную.

Мне нужен совет как правильно это реализовать, меня терзают сомнения то , что в методе successCallback я вызываю render и это не правильно.

То как я это реализовал в successCallback все же верно, куда копать, а если нет, то как передать эти модели правильным путем.
Я не сохраняю модель Social так как мне не известен будущий id пользователя, как обстоят дела с этим в этой версии фреймворка. Как получить id будующей записи?
zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

Re: Yii Auth и явная регистрация

Сообщение zelenin »

Линус Торвальдс говорил: не надо бла-бла, покажи мне код.
zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

Re: Yii Auth и явная регистрация

Сообщение zelenin »

Код моего контроллера. Оставил только то, что отвечает за регистрацию.

Код: Выделить всё

<?php

namespace backend\modules\user\controllers;

use common\modules\user\models\Account;
use common\modules\user\models\forms\LoginForm;
use common\modules\user\models\forms\RegisterForm;
use common\modules\user\models\User;
use common\modules\user\Module;
use Yii;
use yii\authclient\AuthAction;
use yii\authclient\ClientInterface;
use yii\filters\AccessControl;
use yii\helpers\Url;
use yii\web\Controller;

class AuthController extends Controller
{
    public function actions()
    {
        return [
            'auth' => [
                'class' => AuthAction::className(),
                'successCallback' => [$this, 'authenticate']
            ],
        ];
    }

    public function behaviors()
    {
        return [
            'access' => [
                'class' => AccessControl::className(),
                'rules' => [
                    [
                        'actions' => ['login', 'register', 'request-password-reset', 'reset-password'],
                        'allow' => true,
                        'roles' => ['?']
                    ],
                    [
                        'actions' => ['auth', 'connect'],
                        'allow' => true,
                        'roles' => ['?', '@']
                    ],
                    ['actions' => ['logout'], 'allow' => true, 'roles' => ['@']]
                ]
            ]
        ];
    }

    public function actionLogin()
    {
        if (!Yii::$app->getUser()->getIsGuest()) {
            $this->goHome();
        }
        $model = new LoginForm;
        if ($model->load(Yii::$app->getRequest()->post()) && $model->login()) {
            return $this->goBack();
        } else {
            return $this->render('login', ['model' => $model]);
        }
    }

    public function actionLogout()
    {
        Yii::$app->getUser()->logout();
        return $this->goHome();
    }

    public function actionRegister()
    {
        $model = new RegisterForm();
        if ($model->load(Yii::$app->getRequest()->post())) {
            if ($user = $model->register()) {
                if (Yii::$app->getUser()->login($user)) {
                    return $this->goHome();
                }
            }
        }
        return $this->render('register', ['model' => $model]);
    }

    public function actionConnect($providerId)
    {
        $model = new RegisterForm();
        $account = Account::find()->where([
            'user_id' => null,
            'provider_id' => $providerId
        ])->one();
        if ($account && $model->load(Yii::$app->getRequest()->post())) {
            if ($user = $model->register()) {
                $user->link('accounts', $account);
                if (Yii::$app->getUser()->login($user)) {
                    return $this->goHome();
                }
            }
        }
        return $this->render('register', ['model' => $model]);
    }

    public function authenticate(ClientInterface $client)
    {
        $provider = $client->getId();
        $attributes = $client->getUserAttributes();

        /** @var User $identity */
        $identity = Yii::$app->getUser()->getIdentity();

        $account = Account::find()->where([
            'provider' => $provider,
            'provider_id' => $attributes['id']
        ])->one();
        if (!$account) {
            $account = new Account;
            $account->setAttributes([
                'provider' => $provider,
                'provider_id' => $attributes['id'],
                'data' => json_encode($attributes, JSON_UNESCAPED_UNICODE)
            ], false);
            if ($identity) {
                $account->setAttribute('user_id', $identity->id);
            }
            $account->save(false);
        }
        if ($account->user) {
            if ($identity) {
                Yii::$app->getSession()->setFlash('success', $provider . ' ' . Module::t('is connected'));
                $this->action->successUrl = Url::toRoute(['/user/default/update', 'id' => $identity->id]);
            }
            Yii::$app->getUser()->login($account->user, 3600 * 24 * 30);
        } else {
            $this->action->successUrl = Url::toRoute(['/user/auth/connect', 'providerId' => $attributes['id']]);
        }
    }
}
 
german.igortcev
Сообщения: 251
Зарегистрирован: 2014.08.18, 14:01

Re: Yii Auth и явная регистрация

Сообщение german.igortcev »

zelenin писал(а):Линус Торвальдс говорил: не надо бла-бла, покажи мне код.

Код: Выделить всё

public function successCallback($client)
    {
        
        $attributes = $client->getUserAttributes();
        
        $id = $attributes['id'];
        $service = $attributes['service'];
        
        $record = \app\models\Social::findOne(['identity' => $id, 'service' => $service]);
        //Пользователь существует
        if($record){
            
        }  else {
            //Пользователь впервые
            $social = new \app\models\Social();
            $social->identity = $id;
            $social->service = $service;
            
            $signup = new SignupForm;
            $signup->username = $attributes['displayName'];
            
            $this->render('signup', ['model' => $signup, 'social' => $social]);
            
        }
 
german.igortcev
Сообщения: 251
Зарегистрирован: 2014.08.18, 14:01

Re: Yii Auth и явная регистрация

Сообщение german.igortcev »

zelenin писал(а):Код моего контроллера. Оставил только то, что отвечает за регистрацию.

Код: Выделить всё

<?php

namespace backend\modules\user\controllers;

use common\modules\user\models\Account;
use common\modules\user\models\forms\LoginForm;
use common\modules\user\models\forms\RegisterForm;
use common\modules\user\models\User;
use common\modules\user\Module;
use Yii;
use yii\authclient\AuthAction;
use yii\authclient\ClientInterface;
use yii\filters\AccessControl;
use yii\helpers\Url;
use yii\web\Controller;

class AuthController extends Controller
{
    public function actions()
    {
        return [
            'auth' => [
                'class' => AuthAction::className(),
                'successCallback' => [$this, 'authenticate']
            ],
        ];
    }

    public function behaviors()
    {
        return [
            'access' => [
                'class' => AccessControl::className(),
                'rules' => [
                    [
                        'actions' => ['login', 'register', 'request-password-reset', 'reset-password'],
                        'allow' => true,
                        'roles' => ['?']
                    ],
                    [
                        'actions' => ['auth', 'connect'],
                        'allow' => true,
                        'roles' => ['?', '@']
                    ],
                    ['actions' => ['logout'], 'allow' => true, 'roles' => ['@']]
                ]
            ]
        ];
    }

    public function actionLogin()
    {
        if (!Yii::$app->getUser()->getIsGuest()) {
            $this->goHome();
        }
        $model = new LoginForm;
        if ($model->load(Yii::$app->getRequest()->post()) && $model->login()) {
            return $this->goBack();
        } else {
            return $this->render('login', ['model' => $model]);
        }
    }

    public function actionLogout()
    {
        Yii::$app->getUser()->logout();
        return $this->goHome();
    }

    public function actionRegister()
    {
        $model = new RegisterForm();
        if ($model->load(Yii::$app->getRequest()->post())) {
            if ($user = $model->register()) {
                if (Yii::$app->getUser()->login($user)) {
                    return $this->goHome();
                }
            }
        }
        return $this->render('register', ['model' => $model]);
    }

    public function actionConnect($providerId)
    {
        $model = new RegisterForm();
        $account = Account::find()->where([
            'user_id' => null,
            'provider_id' => $providerId
        ])->one();
        if ($account && $model->load(Yii::$app->getRequest()->post())) {
            if ($user = $model->register()) {
                $user->link('accounts', $account);
                if (Yii::$app->getUser()->login($user)) {
                    return $this->goHome();
                }
            }
        }
        return $this->render('register', ['model' => $model]);
    }

    public function authenticate(ClientInterface $client)
    {
        $provider = $client->getId();
        $attributes = $client->getUserAttributes();

        /** @var User $identity */
        $identity = Yii::$app->getUser()->getIdentity();

        $account = Account::find()->where([
            'provider' => $provider,
            'provider_id' => $attributes['id']
        ])->one();
        if (!$account) {
            $account = new Account;
            $account->setAttributes([
                'provider' => $provider,
                'provider_id' => $attributes['id'],
                'data' => json_encode($attributes, JSON_UNESCAPED_UNICODE)
            ], false);
            if ($identity) {
                $account->setAttribute('user_id', $identity->id);
            }
            $account->save(false);
        }
        if ($account->user) {
            if ($identity) {
                Yii::$app->getSession()->setFlash('success', $provider . ' ' . Module::t('is connected'));
                $this->action->successUrl = Url::toRoute(['/user/default/update', 'id' => $identity->id]);
            }
            Yii::$app->getUser()->login($account->user, 3600 * 24 * 30);
        } else {
            $this->action->successUrl = Url::toRoute(['/user/auth/connect', 'providerId' => $attributes['id']]);
        }
    }
}
Обязательно setAttributes ? Просто в 1.1 использовал $model->attr = var;
zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

Re: Yii Auth и явная регистрация

Сообщение zelenin »

german.igortcev писал(а):Обязательно setAttributes ? Просто в 1.1 использовал $model->attr = var;
как нравится. мне нравится загружать массив атрибутов в функцию.
zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

Re: Yii Auth и явная регистрация

Сообщение zelenin »

german.igortcev писал(а):
zelenin писал(а):Линус Торвальдс говорил: не надо бла-бла, покажи мне код.

Код: Выделить всё

public function successCallback($client)
    {
        
        $attributes = $client->getUserAttributes();
        
        $id = $attributes['id'];
        $service = $attributes['service'];
        
        $record = \app\models\Social::findOne(['identity' => $id, 'service' => $service]);
        //Пользователь существует
        if($record){
            
        }  else {
            //Пользователь впервые
            $social = new \app\models\Social();
            $social->identity = $id;
            $social->service = $service;
            
            $signup = new SignupForm;
            $signup->username = $attributes['displayName'];
            
            $this->render('signup', ['model' => $signup, 'social' => $social]);
            
        }
пойми, тебя редиректит на главную, а в этом куске кода нет никакого редиректа. Этот кусок кода скорее всего даже не участвует в твоей проблеме. Я тебе дал весь свой контроллер. Посмотри как работает, и сделай также.
Присоединенные к учетки соцсети я храню в Account
Ответить