Как начать: Быстрый старт | Расширение AuthClient для Yii 2 | Yii PHP Framework

Требования к системе авторизации

При проектировании расширения я руководствовался следующими принципами:

  1. Необходимость абстрагироваться от тонкостей авторизации через различные типы сервисов, использование адаптеров для каждого сервиса.
  2. Получение уникального идентификатора авторизации, который можно использовать для регистрации пользователя в нашем приложении.
  3. Возможность расширения стандартных классов авторизации для получения дополнительных данных о пользователе.
  4. Возможность работать с API социальных сетей путем расширения класса авторизации необходимого сервиса.
  5. Возможность настраивать список поддерживаемых сайтом сервисов, переопределять внешний вид виджета авторизации. Возможность использовать popup окно для авторизации без закрытия нашего приложения.

Расширение EAuth

В результате реализации всех требований выше на свет появилось расширение EAuth.

На данный момент расширение содержит:

Установка


Для начала необходимо

2 Настройка

В конфигурацию

`main.php`

необходимо добавить:

Использование


В качестве примера возьмем стандартное приложение Yii, сгенерированное командой

`yiic webapp create`

, и добавим возможность авторизации через Google и Яндекс (OAuth провайдеров подключать не будем, чтобы не возиться с ключами). Посмотреть готовую

2 Редактирование SiteContoller

Вторым шагом будет изменение действия

`site/login`

. Добавим следующий код в начало действия:

3 Редактируем представление `protected/views/site/login.php`


Для использования стандартного виджета достаточно добавить пару строк после основной формы:

Для изменения внешнего вида виджета можно скопировать файл

`protected/extensions/eauth/views/auth.php``[theme_name]/views/EAuthWidget/auth.php`

4 Результат

После всех проделанных действий мы можем открыть наш сайт и перейти на страницу Login. После стандартной формы авторизации появятся иконки сервисов авторизации:

При клике, например, по иконке Google откроется popup окно: Popup окно авторизации

Database connection setup

Configure the database connection component db in your configuration file to reflect the right tablePrefix as needed for your environment.

Installation

The preferred way to install this extension is through composer.

Either run

or add

to the require section of your composer.json file.

Run $ php composer.phar update from your console to get the latest version of the module packages.

Setup base path

Create a folder on your application where profile avatar images will be stored. Then configure your Module::profileSettings[‘basePath’] to point to this folder. This by default is set to @webroot/uploads, so you can directly create an uploads folder on your web root and proceed.

Setup profile

Optional Setup.

The profile settings for the module can be enabled and configured via the Module::profileSettings[‘enabled’] property, which is true by default. In order to begin using the module for profile avatar upload, carry out the following steps.

Setup session storage

Create the following folders in your Yii 2 advanced app.

  • frontend/runtime/sessions
  • backend/runtime/sessions

Setup social component

Optional Setup.

Usage with yii 2 advanced template

You can configure the module to work easily with the Yii 2 Advanced Application Template and have different sessions for frontend and backend of the Yii 2 advanced app. For this you may carry out the following steps:

Базовая структура клиента аутентификации ¶

Хоть все клиенты и разные, всё же они реализуют базовый интерфейс yiiauthclientClientInterface, который управляет
общим API.

У каждого клиента есть некоторые описательные данные, которые могут использоваться в различных целях:

Добавление виджета в представление аутентификации ¶

В представлениях можно использовать готовый виджет yiiauthclientwidgetsAuthChoice:

Добавление экшена в контроллер

Следующий шаг заключается в добавлении [[yiiauthclientAuthAction]] в веб контроллер и обеспечении реализации
successCallback, выполняющий ваши требования.

classSiteControllerextendsController
{
    publicfunctionactions()
    {
        return [
            'auth' => [
                'class' => 'yiiauthclientAuthAction',
                'successCallback' => [$this, 'onAuthSuccess'],
            ],
        ];
    }

    publicfunctiononAuthSuccess($client)
    {
        $attributes = $client->getUserAttributes();

        /* @var $auth Auth */$auth = Auth::find()->where([
            'source' => $client->getId(),
            'source_id' => $attributes['id'],
        ])->one();
        
        if (Yii::$app->user->isGuest) {
            if ($auth) { // авторизация$user = $auth->user;
                Yii::$app->user->login($user);
            } else { // регистрацияif (isset($attributes['email']) && User::find()->where(['email' => $attributes['email']])->exists()) {
                    Yii::$app->getSession()->setFlash('error', [
                        Yii::t('app', "Пользователь с такой электронной почтой как в {client} уже существует, но с ним не связан. Для начала войдите на сайт использую электронную почту, для того, что бы связать её.", ['client' => $client->getTitle()]),
                    ]);
                } else {
                    $password = Yii::$app->security->generateRandomString(6);
                    $user = newUser([
                        'username' => $attributes['login'],
                        'email' => $attributes['email'],
                        'password' => $password,
                    ]);
                    $user->generateAuthKey();
                    $user->generatePasswordResetToken();
                    $transaction = $user->getDb()->beginTransaction();
                    if ($user->save()) {
                        $auth = newAuth([
                            'user_id' => $user->id,
                            'source' => $client->getId(),
                            'source_id' => (string)$attributes['id'],
                        ]);
                        if ($auth->save()) {
                            $transaction->commit();
                            Yii::$app->user->login($user);
                        } else {
                            print_r($auth->getErrors());
                        }
                    } else {
                        print_r($user->getErrors());
                    }
                }
            }
        } else { // Пользователь уже зарегистрированif (!$auth) { // добавляем внешний сервис аутентификации$auth = newAuth([
                    'user_id' => Yii::$app->user->id,
                    'source' => $client->getId(),
                    'source_id' => $attributes['id'],
                ]);
                $auth->save();
            }
        }
    }
}

Метод successCallback вызывается, когда пользователь был успешно аутентифицирован через внешний сервис. Через
экземпляр $client мы можем извлечь полученную информацию. В нашем случае мы хотели бы:

  • Если пользователь гость и в таблице auth существует запись, то проводим аутентификацию этого пользователя.
  • Если пользователь гость и в таблице auth записи не существует, то создаём нового пользователя и запись в таблице auth. После
    проводим аутентификацию пользователя.
  • Если пользователь прошёл аутентификацию и запись в таблице auth не найдена, то пытаемся подключить дополнительный
    аккаунт (сохранить его данные в таблицу auth).

Добавление экшена в контроллер ¶

Следующий шаг заключается в добавлении yiiauthclientAuthAction в веб контроллер и обеспечении реализации
successCallback, выполняющий ваши требования.

Настройка приложения

После установки расширения необходимо настроить компонент приложения auth client collection:

return [
    'components' => [
        'authClientCollection' => [
            'class' => 'yiiauthclientCollection',
            'clients' => [
                'google' => [
                    'class' => 'yiiauthclientclientsGoogle',
                    'clientId' => 'google_client_id',
                    'clientSecret' => 'google_client_secret',
                ],
                'facebook' => [
                    'class' => 'yiiauthclientclientsFacebook',
                    'clientId' => 'facebook_client_id',
                    'clientSecret' => 'секретный_ключ_facebook_client',
                ],
                // и т.д.
            ],
        ]
        // ...
    ],
    // ...
];

Из коробки предоставляются следующие клиенты:

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

Получение дополнительных данных с помощью дополнительных обращений к api ¶

Оба клиента, yiiauthclientOAuth1 и yiiauthclientOAuth2, обеспечивают метод api(), который может быть
использован для доступа к REST API внешнего сервиса аутентификации. Однако это метод очень простой и этого может быть
недостаточно, что бы получить полный доступ к функционалу внешнего API. Данный метод используется, в основном, для
получения данных внешней учетной записи пользователя.

Что бы использовать дополнительные обращения к API, необходимо настроить yiiauthclientBaseOAuth::$apiBaseUrl в
соответствии со спецификацией API. Тогда Вы сможете вызвать метод yiiauthclientBaseOAuth::api():

Ссылки

UPDATE:

в пункте «3.2 Настройка» не хватало расширения loid, добавил.

UPDATE 2:

Актуальная версия и инструкция по настройке доступны на

Установка расширения

Для установки расширения используйте Composer. Запустите

или добавьте

в секцию require вашего composer.json.

Backend configuration

Add the following configuration for cookies and sessions to your backend app within backend/config/main-local.php. Note you can optionally configure a different URL manager in backend to get access to frontend URL routes (for example urlManagerFE as shown below).

'components' => [
    'request' => [
        // !!! insert a secret key in the following (if it is empty) - this is required by cookie validation'cookieValidationKey' => 'UNIQUE_KEY_BACKEND',
        // unique CSRF cookie parameter for backend'csrfParam' => '_backendCsrf',
    ],
    // unique identity cookie parameter for backend'user' => [
        'identityCookie' => [
            'name' => '_backendCookie', // unique for backend'path' => '/backend', // set it to correct path for backend app
        ]
    ],
    // unique identity session parameter for backend'session' => [
        'name' => '_backendSessionId',
        'savePath' => __DIR__ . '/../runtime/sessions',  
    ],    
    // url manager to access frontend'urlManagerFE' => [
        'class' => 'yiiweburlManager',
        'baseUrl' => '/advanced',
        'enablePrettyUrl' => true,
        'showScriptName' => false,
    ]
]

Заключение

Вот и все, система авторизации готова к работе. Что еще можно делать с расширением:

Frontend configuration

Add the following configuration for cookies and sessions to your frontend app within frontend/config/main-local.php.

Похожее:  OAuth 2.0 – базовые понятия понятным языком

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

Ваш адрес email не будет опубликован. Обязательные поля помечены *