Если вы спрашиваете: «Что такое Yii?» Посмотрите мой предыдущий учебник: Введение в Yii Framework , который рассматривает преимущества Yii и включает обзор того, что нового в Yii 2.0, выпущенном в октябре 2014 года.
В этой серии «Программирование с Yii2» я расскажу читателям, как использовать обновленную версию Yii2 Framework для PHP. В этом руководстве мы познакомим вас с интеграцией встроенной поддержки AuthClient для обеспечения входа из сторонних сетей, таких как Twitter, Google и Facebook.
Для этих примеров мы продолжим предполагать, что мы создаем структуру для публикации простых обновлений статуса, например, нашего собственного мини-Twitter, используя нашу привет кодовую базу. Используйте ссылки GitHub на этой странице, чтобы загрузить репозиторий кода.
В Программирование с помощью Yii2: интеграция регистрации пользователей я прошел интеграцию библиотеки Yii2-User для регистрации и аутентификации пользователей. В этом уроке мы узнаем, как интегрировать AuthClient с Yii2-User и переопределить его представления.
Просто напоминание, я участвую в обсуждениях ниже. Если у вас есть вопрос или предложение по теме, пожалуйста, оставьте комментарий ниже. Вы также можете связаться со мной в Twitter @reifman или написать мне в Lookahead Consulting .
Что такое AuthClient?
AuthClient — это встроенная поддержка Yii для ваших приложений для аутентификации через сторонние сервисы с OpenID , OAuth или OAuth2 .
Например, AuthClient предоставляет поддержку новым посетителям для регистрации и входа в ваше приложение, используя свою учетную запись Twitter вместо того, чтобы указывать пароль.
Из коробки предоставляется поддержка следующих клиентов:
- GitHub
- Google (через OpenID и OAuth )
- Microsoft Live
- щебет
- Также популярны российские сервисы ВКонтакте и Яндекс (через OpenID и OAuth )
Конфигурация для каждого клиента немного отличается. Для OAuth требуется получить идентификатор клиента и секретный ключ от службы, которую вы собираетесь использовать. Для OpenID это работает из коробки в большинстве случаев.
В этом уроке я расскажу, как добавить аутентификацию Twitter и Google.
Установка AuthClient в нашем приложении
Добавить AuthClient в Composer
Во-первых, нам нужно добавить библиотеку AuthClient в composer.json:
01
02
03
04
05
06
07
08
09
10
11
|
«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»: «*»
},
|
Затем нам нужно обновить composer:
01
02
03
04
05
06
07
08
09
10
|
sudo composer update
Password:
Loading composer repositories with package information
Updating dependencies (including require-dev)
— Removing bower-asset/jquery.inputmask (3.1.58)
— Installing bower-asset/jquery.inputmask (3.1.61)
Loading from cache
Writing lock file
Generating autoload files
|
Настройка поддержки AuthClient
Нам нужно добавить параметры конфигурации AuthClient в наш файл веб-конфигурации в \config\web.php
.
Добавьте элементы массива для всех сторонних сервисов, которые вы хотите поддерживать (подробности для каждого можно найти в Руководстве AuthClient ). Сейчас мы будем использовать ключи-заполнители для Twitter.
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
<?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\GoogleOpenId’
],
‘twitter’ => [
‘class’ => ‘yii\authclient\clients\Twitter’,
‘consumerKey’ => ‘twitter_consumer_key’,
‘consumerSecret’ => ‘twitter_consumer_secret’,
],
],
],
|
Google будет работать из коробки без дополнительной настройки, но для Twitter нам нужно зарегистрировать приложение.
Зарегистрируйте наше приложение Twitter
Создайте новое приложение Twitter на панели инструментов приложения Twitter :
Нажмите Создать новое приложение . Я обнаружил, что URL-адрес обратного вызова не нужен, но сейчас я использовал заполнитель http://mydomain.com/user/security/auth .
Вот новая страница для нашего приложения:
Вот страница настроек :
Вот страница Ключи и токены доступа . Здесь нам нужно скопировать Consumer Key (API Key) и Consumer Secret (API Secret) :
Мы воспользуемся этими ключами через минуту.
Защита ключей от GitHub
В разделе Защита ваших ключей от GitHub я подробно описал, как я использую файл конфигурации для хранения всех моих ключей, кроме моего репозитория GitHub. Затем я включаю этот файл в начало моих файлов конфигурации Yii. Это удерживает меня от случайной проверки моих ключей к моему хранилищу и взлома моих учетных записей.
Кроме того, в разделе «Введение в MailTrap: поддельный SMTP-сервер для предпроизводственного тестирования электронной почты приложения» я начал интегрировать пользовательские настройки SMTP MailTrap в свою конфигурацию Yii SwiftMailer для целей тестирования. Это обеспечит получение электронных писем о регистрации при регистрации на нашей локальной платформе разработки.
Мы помещаем ключи приложения Twitter и SMTP-ключи /var/secure/hello.ini
в /var/secure/hello.ini
вне репозитория:
1
2
3
4
5
|
oauth_twitter_key =»xxxxxxxxxxxxxxxxxx»
oauth_twitter_secret=»xxxxxyyyyzzzzzzz222222x1111xx»
smtp_host = «mysmtp.com»
smtp_username = «apple12345678»
smtp_password = «yyyzz!!!!32vd»
|
Вот код в \config\web.php
который включает эти настройки и устанавливает отдельные переменные конфигурации:
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
<?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 для SwiftMailer:
01
02
03
04
05
06
07
08
09
10
11
12
13
|
‘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.
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
|
use yii\db\Schema;
use dektrium\user\migrations\Migration;
/**
* @author Dmitry Erofeev <[email protected]>
*/
class m140504_130429_create_token_table extends Migration
{
public function up()
{
$this->createTable(‘{{%token}}’, [
‘user_id’ => Schema::TYPE_INTEGER .
‘code’ => Schema::TYPE_STRING .
‘created_at’ => Schema::TYPE_INTEGER .
‘type’ => Schema::TYPE_SMALLINT .
], $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}}’);
}
}
|
Мы рассмотрим содержимое этой таблицы в конце этого урока, после того как мы зарегистрировались через Twitter.
Добавьте виджет AuthClient в пользовательский интерфейс
На странице входа в систему Yii2-User отображается виджет Connect для служб AuthClient на странице входа — обратите внимание на значки Google и Twitter в нижней части страницы:
Однако по какой-то причине они не включены в регистрационную страницу регистрации. Это кажется упущением для меня.
Чтобы изменить страницу регистрации, нам нужно переопределить представление регистрации. К счастью, Yii и Yii2-user делают это легко — см. Также Переопределение видов в Yii2-User .
Возвращаясь к \config\web.php
, мы добавляем компонент вида ниже:
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
|
<?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’ => [
|
Затем мы помещаем нашу собственную модифицированную версию Yii2-User’s register.php в @app/views/user/registration/register.php
. Когда запрашивается страница регистрации, Yii загрузит нашу версию, которая включает в себя виджет Connect:
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
|
<?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>
|
Вот наша страница регистрации сейчас:
Пользовательский опыт подключения через сервисы
Вот как выглядит процесс регистрации. Когда вы нажмете на значок Twitter выше, он попросит вас войти в свою учетную запись Twitter:
Затем он попросит вас авторизовать приложение с вашей учетной записью:
Затем вы перейдете к форме регистрации Connect в нашем приложении — эту страницу также предоставляет пользователь Yii2:
Когда вы нажимаете кнопку Готово , он вставляет ваш токен OAuth в таблицу Token и перенаправляет вас на домашнюю страницу, полностью аутентифицированную нашим приложением:
Вот загляните внутрь таблицы Token, в которой хранятся ключи сеанса службы для каждого пользователя:
При последующих попытках входа Twitter будет перенаправлять вас без дополнительной авторизации.
Вот так мы интегрируем сторонние сервисы в базовый шаблон приложения Yii2 с Yii2-User. Надеюсь, вы довольны тем, насколько это просто.
Возможно, вы захотите ознакомиться с нашей серией «Построение стартапа с помощью PHP» , в которой будет использоваться расширенный шаблон Yii2 с поддержкой сторонних разработчиков (кроме Yii2-User).
Что дальше?
Следите за будущими уроками в моей серии «Программирование с Yii2», поскольку я продолжаю изучать различные аспекты фреймворка.
Я приветствую тематические и тематические запросы. Вы можете опубликовать их в комментариях ниже или написать мне по электронной почте на моем сайте Lookahead Consulting .
Если вы хотите узнать, когда появится следующий учебник по Yii2, следуйте за мной @reifman в Твиттере или зайдите на страницу моего инструктора . Моя страница инструктора будет включать все статьи из этой серии, как только они будут опубликованы.
- Руководство по расширению AuthClient для Yii 2
- Документация библиотеки Yii2 OAuth2
- Yii2 Developer Exchange , мой ресурсный сайт Yii2
- Коллекция скриптов на основе Yii на CodeCanyon