Yii2 позволяет легко создать механизм регистрации/входа/профиля через расширение yii2-user.

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

  • /user/registration/register Регистрация
  • /user/registration/resend Повторная отправка инструкций по регистрации
  • /user/registration/confirm Подтверждение пароля
  • /user/security/login Форма авторизации
  • /user/security/logout Выход(работает только через POST)
  • /user/recovery/request Востановление пароля
  • /user/settings/profile Настройки профиля
  • /user/settings/account Настройки аккаунта (email, username, password)
  • /user/settings/networks Привязанные социальные аккаунты
  • /user/profile/show Профиль пользователя (требует id)
  • /user/admin/index Менеджер пользователей

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

Что такое AuthClient?

AuthClient является встроенным механизмом Yii для проверки подлинности с помощью сторонних сервисов с использованием OpenID , OAuth или OAuth2 .

Например, AuthClient  позволяет зарегистрироваться и войти на сайт с помощью своей учетной записи Twitter вместо того, чтобы вводить пароль или проходить утомительную процедуру регистрации.

Из коробки, есть поддержка следующих клиентов:

  • facebook
  • GitHub
  • Google (через OpenID и OAuth)
  • LinkedIn
  • Microsoft Живая
  • Twitter
  • Также популярные российские службы ВКонтакте и Яндекс (через OpenID и OAuth)

Конфигурация для каждого клиента немного отличается. Для OAuth требуется получить идентификатор клиента и секретный ключ от службы, которую вы собираетесь использовать . Для OpenID он работает из коробки в большинстве случаев .

В этом уроке будет лишь добавление аутентификации Twitter и Google.

Установка AuthClient в наше приложение

Добавляем AuthClient в composer.json

Первое, что нужно сделать, это добавить библиотеку AuthClient в composer.json:

"minimum-stability": "stable",
    "require": {
        "php": ">=5.4.0",
        "yiisoft/yii2": "*",
        "yiisoft/yii2-bootstrap": "*",
        "yiisoft/yii2-swiftmailer": "*",
        "dektrium/yii2-user": "0.8.2",
        "stichoza/google-translate-php": "~2.0",
        "yiidoc/yii2-redactor": "2.0.0",
        "yiisoft/yii2-authclient": "*"
    },

Далее, выполняем

php composer.phar update

Настрйока AuthClient

Нам нужно добавить параметры конфигурации AuthClient в наш файл конфигурации config/web.php

Добавляем элемент массива для всех сторонних сервисов, которые вы будете поддерживать (подробности по каждому можно найти в Руководстве по AuthClient).

На данный момент, мы заполним настройки для Twitter и Google.

<?php
 
$params = require(__DIR__ . '/params.php');
 
$config = [
    'id' => 'basic',
    'basePath' => dirname(__DIR__),
    'bootstrap' => ['log'],
    'language'=>'en', // back to English
    'components' => [
      'authClientCollection' => [
              'class' => 'yii\authclient\Collection',
              'clients' => [
                  'google' => [
                      'class' => 'yii\authclient\clients\GoogleOAuth',
                      'clientId' => 'google_client_id',
                      'clientSecret' => 'google_client_secret',
                  ],
                  'twitter' => [
                       'class' => 'yii\authclient\clients\Twitter',
                       'consumerKey' => 'twitter_consumer_key',
                       'consumerSecret' => 'twitter_consumer_secret',
                  ],
              ],
        ],

Рассмотрим настройку Twitter. Необходимо зарегистрировать приложение.

Регистрируем наше Twitter приложение

Заходим Twitter Application Dashboard:

 

Twitter Application Dashboard

Нажмите кнопку Create New App. Заполнять Callback URL нет необходимости, но сейчас можетезаполнить так заполнитель http://sitename.ru/usitenameity/auth

Create New App

Вот новая страница для вашего приложения:

Вот новая страница для вашего приложения

Перейдитев на вкладку Keys and Access Tokens. Здесь скопируйте Consumer Key (API Key) и Consumer Secret (API Secret):

Keys and Access Tokens

Мы будем использовать эти ключи в дальнейшем.

Регистрируем наше Google приложение

Переходим по ссылке https://console.developers.google.com/project

Создание приложения Google

Жмем по кнопке Create Project

Жмем по кнопке Create Project

Заполняем имя проекта. После этого он немного задумается. Надо подождать. Далее вы увидите страницу выбора API. Но нам она не нужна. Переходим на страницу Credentials. И заполняем обязательные поля. Необязательные помечены как 'Optional'

Credentials Google

Жмем Save. В появившемся окошке жмем Create credenails и выбираем OAuth clientID

Create credenails и выбираем OAuth clientID Google

После чего выбираем в списке Web application и заполняем все поля как на скрине.

Web application и заполняем все поля как на скрине

Обратите внимание на поле Authorized redirect URIs и Authorized JavaScript origins. Без их заполнения, форма даст себя схранить, однако авторизация не будет работать. В Authorized JavaScript origins надо вписать адрес хоста (с указанием протокола), а в Authorized redirect URIs вписать http://sitename.ru/user/security/auth?authclient=google. Не забудьте поменять хост на свой.

Жмем Create. И видим наши ключи.

Защита ключей от публикации на Github

Огромное количество взломов сайтов связано с тем, что ключи, подобные тем, что мы сделали выше, утекают в открытый github репозиторий, при коммите. Ведь файл конфигурации в Yii2, это обычный php файл, который также, как и все остальные индексируется git.

В этой ситуации, верным решением будет - держать все пароли, секретные ключи и т.д. в отдельном ini файле, выше папки репозитория. И подключать файл отдельно.

Создаем /var/secure/hello.ini. Путь может быть любой, главное, чтобы файл не был доступен через браузер, (т.е. находился выше корневой категории сайта) и лежал выше корня репозитория.

oauth_twitter_key ="xxxxxxxxxxxxxxxxxx"
oauth_twitter_secret="xxxxxyyyyzzzzzzz222222x1111xx"
smtp_host = "mysmtp.com"
smtp_username = "apple12345678"
smtp_password = "yyyzz!!!!32vd"

Далее, просто подключаем этот файл при помощи удобной функции parse_ini_file

>?php
$config = parse_ini_file('/var/secure/hello.ini', true);
 
$params = require(__DIR__ . '/params.php');
 
$config = [
    'id' => 'basic',
    'basePath' => dirname(__DIR__),
    'bootstrap' => ['log'],
    'language'=>'en', // back to English
    'components' => [
      'authClientCollection' => [
              'class' => 'yii\authclient\Collection',
              'clients' => [
                  'google' => [
                      'class' => 'yii\authclient\clients\GoogleOpenId'
                  ],
                  'twitter' => [
                       'class' => 'yii\authclient\clients\Twitter',
                       'consumerKey' => $config['oauth_twitter_key'] ,
                       'consumerSecret' => $config['oauth_twitter_secret'] ,
                  ],
              ],
        ],

Как вы могли заметить, мы еще скрыли конфигурацию отправки почты через SMTP сервер. Ведь это просто логин пароль от вашего почтового аккаунта. Их утеря чревата. Настройка параметров SMTP для SwiftMailer:

'mailer' => [
        'class' => 'yii\swiftmailer\Mailer',
        'viewPath' => '@app/mailer',
        'useFileTransport' => false,
        'transport' => [
            'class' => 'Swift_SmtpTransport',
            'host' => $config['smtp_host'],
            'username' => $config['smtp_username'],
            'password' => $config['smtp_password'],
            'port' => '25',
            'encryption' => 'tls',
                        ],
    ],

Обновляем схему базы данных для хранения сессионных ключей

Поскольку мы используем Yii2-User, он уже представил таблицу токена для хранения ключей AuthClient.

use yii\db\Schema;
use dektrium\user\migrations\Migration;
 
/**
 * @author Dmitry Erofeev <dmeroff@gmail.com>
 */
class m140504_130429_create_token_table extends Migration
{
    public function up()
    {
        $this->createTable('{{%token}}', [
            'user_id'    => Schema::TYPE_INTEGER . ' NOT NULL',
            'code'       => Schema::TYPE_STRING . '(32) NOT NULL',
            'created_at' => Schema::TYPE_INTEGER . ' NOT NULL',
            'type'       => Schema::TYPE_SMALLINT . ' NOT NULL'
        ], $this->tableOptions);
 
        $this->createIndex('token_unique', '{{%token}}', ['user_id', 'code', 'type'], true);
        $this->addForeignKey('fk_user_token', '{{%token}}', 'user_id', '{{%user}}', 'id', 'CASCADE', 'RESTRICT');
    }
 
    public function down()
    {
        $this->dropTable('{{%token}}');
    }
}

Добавляем виджет AuthClient в интерфейс

Cтраница входа Yii2-User отображает виджет услуг AuthClient, обратите внимание на Google и Twitter иконки в нижней части страницы:

Страница входа Yii2-User виджет услуг AuthClient Google и Twitter

Но по каким-то причинам, они не включены на странице регистрации. 

Для того, чтобы изменить страницу регистрации, мы должны переопределить вид регистрации. К счастью, Yii и Yii2-user сделать это довольно просто, используя механизм переопределений Yii2-user.

Возвращаемся к \config\web.php, добавляем компонент view:

<?php
$config = parse_ini_file('/var/secure/hello.ini', true);
 
$params = require(__DIR__ . '/params.php');
 
$config = [
    'id' => 'basic',
    'basePath' => dirname(__DIR__),
    'bootstrap' => ['log'],
    'language'=>'en', // back to English
    'components' => [
      'view' => [
              'theme' => [
                  'pathMap' => [
                      '@dektrium/user/views' => '@app/views/user'
                  ],
              ],
          ],    
      'authClientCollection' => [

После чего, мы помещаем модифицированную версию register.php Yii2-user в @app/views/user/registration/register.php.

На странице регистрации, мы будем подключать нашу версию с подключенным виджетом AuthConnect

<?php
 
/*
 * This file is part of the Dektrium project.
 *
 * (c) Dektrium project <http://github.com/dektrium>
 *
 * For the full copyright and license information, please view the LICENSE.md
 * file that was distributed with this source code.
 */
 
use yii\helpers\Html;
use yii\widgets\ActiveForm;
use dektrium\user\widgets\Connect;
 
/**
 * @var yii\web\View $this
 * @var yii\widgets\ActiveForm $form
 * @var dektrium\user\models\User $user
 */
 
$this->title = Yii::t('user', 'Sign up');
$this->params['breadcrumbs'][] = $this->title;
?>
<div class="row">
    <div class="col-md-4 col-md-offset-4">
        <div class="panel panel-default">
            <div class="panel-heading">
                <h3 class="panel-title"><?= Html::encode($this->title) ?></h3>
            </div>
            <div class="panel-body">
                <?php $form = ActiveForm::begin([
                    'id' => 'registration-form',
                ]); ?>
 
                <?= Connect::widget([
                    'baseAuthUrl' => ['/user/security/auth']
                ]) ?>
 
                <?= $form->field($model, 'username') ?>
 
                <?= $form->field($model, 'email') ?>
 
                <?php if (Yii::$app->getModule('user')->enableGeneratingPassword == false): ?>
                    <?= $form->field($model, 'password')->passwordInput() ?>
                <?php endif ?>
 
                <?= Html::submitButton(Yii::t('user', 'Sign up'), ['class' => 'btn btn-success btn-block']) ?>
 
                <?php ActiveForm::end(); ?>
            </div>
        </div>
        <p class="text-center">
            <?= Html::a(Yii::t('user', 'Already registered? Sign in!'), ['/user/security/login']) ?>
        </p>
    </div>
</div>

Теперь страница регистрации будет выглядеть примерно так:

Страница регистрации Yii2-user

На этом все. Задавайте ваши вопросы в комментариях. Всего доброго.

Полезные ссылки:

Рассказать друзьям
author.jpg

Платная консультация по вопросам 2500 руб/час

Прочитали статью и остались вопросы? Меня зовут Валерий и я её автор. С радостью объясню Вам в скайпе все затруднительные моменты, которые остались за рамками статьи!

Подробнее ...

Добавить комментарий


Комментарии   

des
+5 # des 13.12.2017 07:49
У клиента Яндекс не закрывается окно при регистрации, и перенаправление происходит в новом маленьком окне
Ответить | Ответить с цитатой | Цитировать | Сообщить модератору
d1mon
+5 # d1mon 19.09.2018 10:09
Спасибо за инструкцию. До сих пор актуальна. Только для Google надо еще один параметр в настройках вписывать ('returnUrl' =>), сейчас без него перестало работать.

https://github.com/yiisoft/yii2-authclient/issues/241
Ответить | Ответить с цитатой | Цитировать | Сообщить модератору
d1mon
+4 # d1mon 19.09.2018 10:12
Спасибо за инструкцию. До сих пор актуальна. Только для Google надо еще один параметр в настройках вписывать ('returnUrl' =>), недавно без него перестало работать.

https://github.com/yiisoft/yii2-authclient/issues/241
Ответить | Ответить с цитатой | Цитировать | Сообщить модератору
Andrew23
+1 # Andrew23 23.02.2021 13:52
Прикольно... Не знал про такие возможности... Большое человеческое спасибо за обширную статью!
Ответить | Ответить с цитатой | Цитировать | Сообщить модератору
here
0 # here 27.11.2021 09:57
Hi there, I check your blog regularly. Your writing style is witty, keep it up!
Ответить | Ответить с цитатой | Цитировать | Сообщить модератору
check here
0 # check here 27.11.2021 10:49
It's remarkable to pay a quick visit this web site
and reading the views of all mates about this piece of
writing, while I am also zealous of getting familiarity.
Ответить | Ответить с цитатой | Цитировать | Сообщить модератору
check here
0 # check here 27.11.2021 11:26
Performing a betting odds comparison is essential if one wants to maximize the potential for a greater payout.
Ответить | Ответить с цитатой | Цитировать | Сообщить модератору
more info
0 # more info 01.12.2021 14:56
As the admin of this site is working, no uncertainty very soon it will be
well-known, due to its quality contents.
Ответить | Ответить с цитатой | Цитировать | Сообщить модератору
check here
0 # check here 01.12.2021 21:00
Hi friends, how is the whole thing, and what you would like to say regarding
this post, in my view its truly awesome for me.
Ответить | Ответить с цитатой | Цитировать | Сообщить модератору
get more info
0 # get more info 02.12.2021 00:49
Thanks for ones marvelous posting! I seriously enjoyed reading
it, you happen to be a great author.I will always bookmark your blog and will come back in the future.
I want to encourage yourself to continue your great writing, have a nice morning!
Ответить | Ответить с цитатой | Цитировать | Сообщить модератору
here
0 # here 02.12.2021 01:20
Piece of writing writing is also a fun, if you be acquainted with afterward you
can write if not it is difficult to write.
Ответить | Ответить с цитатой | Цитировать | Сообщить модератору
website
0 # website 02.12.2021 06:19
Incredible points. Solid arguments. Keep up the good spirit.
Ответить | Ответить с цитатой | Цитировать | Сообщить модератору
check here
0 # check here 02.12.2021 07:00
Hi, I do believe this is an excellent site. I stumbledupon it ;)
I will revisit yet again since i have saved as a favorite it.
Money and freedom is the greatest way to change,
may you be rich and continue to guide other people.
Ответить | Ответить с цитатой | Цитировать | Сообщить модератору
레깅스룸알바
0 # 레깅스룸알바 02.12.2021 11:38
Great post. I'm going through many of these issues as well..
Ответить | Ответить с цитатой | Цитировать | Сообщить модератору
more info
0 # more info 02.12.2021 17:47
I was very happy to find this great site. I wanted to thank you for your time due to this fantastic read!!
I definitely liked every bit of it and I have you saved to fav to look
at new stuff in your website.
Ответить | Ответить с цитатой | Цитировать | Сообщить модератору
read more
0 # read more 02.12.2021 19:20
I've read some excellent stuff here. Definitely worth
bookmarking for revisiting. I surprise how so much attempt you put to create this
type of wonderful informative website.
Ответить | Ответить с цитатой | Цитировать | Сообщить модератору
click here
0 # click here 02.12.2021 21:07
I like what you guys are usually up too. This sort of clever
work and coverage! Keep up the amazing works guys I've incorporated you guys to my blogroll.
Ответить | Ответить с цитатой | Цитировать | Сообщить модератору
read more
0 # read more 02.12.2021 22:54
If you want to increase your experience simply keep visiting this web site and be
updated with the latest information posted here.
Ответить | Ответить с цитатой | Цитировать | Сообщить модератору