Модули аутентификации в PhpBB

Начиная с версии phpBB 3.1 появились встроенные модули аутентификации, которые можно расширить или создавать самостоятельно.

На момент написания статьи, можно выбрать только 1 метод аутентификации, и этот метод выбирается во вкладке «Общие» административной панели, в пункте меню «Аутентификация».

Создание нового модуля аутентификации

Каждый модуль проверки подлинности состоит как минимум из 2 файлов:

  • php класс с условиями аутентификации;

  • запись в config/auth.yml файле, указывающая на php класс.

Модули проверки подлинности являющиеся частью дополнительных расширений должны предоставить свой собственный yaml файл.

Файл класса

Файл с конструктором поставщика будет выполнятся надлежащим образом, находясь по адресу \phpbb\auth\provider\provider_interface.

При модернизации кода указанного в файле \phpbb\auth\provider\base, не рекомендуется добавлять ненужные методы, во избежании поломки при обновлении ядра форума.

Примерное наполнение файла:

<?php

namespace acme\demo\auth\provider;

/**
 * Database authentication provider for phpBB3
 *
 * This is for authentication via the integrated user table
 */
class db2 extends \phpbb\auth\provider\base
{
    /** @var \phpbb\db\driver\driver_interface $db */
    protected $db;

    /**
     * Database Authentication Constructor
     *
     * @param \phpbb\db\driver\driver_interface $db
     */
    public function __construct(\phpbb\db\driver\driver_interface $db)
    {
        $this->db = $db;
    }

    /**
     * {@inheritdoc}
     */
    public function login($username, $password)
    {
        // Auth plugins get the password untrimmed.
        // For compatibility we trim() here.
        $password = trim($password);

        // do not allow empty password
        if (!$password)
        {
            return array(
                'status'    => LOGIN_ERROR_PASSWORD,
                'error_msg' => 'NO_PASSWORD_SUPPLIED',
                'user_row'  => array('user_id' => ANONYMOUS),
            );
        }

        if (!$username)
        {
            return array(
                'status'    => LOGIN_ERROR_USERNAME,
                'error_msg' => 'LOGIN_ERROR_USERNAME',
                'user_row'  => array('user_id' => ANONYMOUS),
            );
        }

        $username_clean = utf8_clean_string($username);

        $sql = 'SELECT user_id, username, user_password, user_passchg, user_pass_convert, user_email, user_type, user_login_attempts
            FROM ' . USERS_TABLE . "
            WHERE username_clean = '" . $this->db->sql_escape($username_clean) . "'";
        $result = $this->db->sql_query($sql);
        $row = $this->db->sql_fetchrow($result);
        $this->db->sql_freeresult($result);

        // Successful login... set user_login_attempts to zero...
        return array(
            'status'    => LOGIN_SUCCESS,
            'error_msg' => false,
            'user_row'  => $row,
        );
    }
}

Сервисный файл

Для правильной интеграции нового провайдера в админку форума, надо добавить соответствующую запись в файл services.yml. Имя сервиса должно быть записано в формате auth.provider.<service name>. Аргументы должны быть указаны в конструкторе поставщика, и могут быть пустыми. Поставщик должен обозначаться меткой { name: auth.provider }, для того чтобы был доступен в админ панели PhpBB.

services:
    auth.provider.db2:
        class: acme\demo\auth\provider\db2
        arguments:
            - '@dbal.conn'
        tags:
            - { name: auth.provider }

Шаблон

Чтобы администратор мог настраивать плагин, доступные поля должны быть созданны и доступны в плагину php-auth-provider. Этот интерфейс конфигурируется в формате HTML в файле adm/style/auth_provider_<providername>.html.

Пример ниже основан на существующих терминах LDAP, используемых для настройки HTTPS-сервера:

<fieldset id="auth_test_settings">
    <legend>{TEST}</legend>
    <dl>
        <dt><label for="https_server">{TEST_SERVER}{L_COLON}</label><br /><span>{TEST_SERVER_EXPLAIN}</span></dt>
        <dd><input type="text" id="https_server" size="40" name="config[https_server]" value="{AUTH_HTTPS_SERVER}" /></dd>
    </dl>
</fieldset>

Значение можно извлечь из <provider>.php файла следующим образом:

$domain = $this->config['https_server'];

OAuth аутентификация и добавление нового поставщика

Начиная с версии phpBB 3.1 поставляется с новым поставщиком аутентификации: OAuth, он основан на библиотеке Lusitanian / PHPoAuthLib.

Для создания новой службы проверки OAuth надо:

  • создать php класс, который будет определять функционал;

  • сделать запись в config/auth.yml файле, указывающую на php класс.

Файл класса

Адрес для размещения класса  \phpbb\auth\provider\provider_interface

В приведенных ниже примерах показано минимальное значение, необходимое для включения службы OAuth в phpBB.

Примерное наполнение файла класса:

<? php 
/ ** 
* 
* Этот файл является частью пакета программного обеспечения phpBB Forum. 
* 
* @ Авторское право (c) phpBB Limited <https://www.phpbb.com> 
* @license GNU General Public License, версия 2 (GPL-2.0) 
* 
* Для получения полной информации об авторских правах и лицензии см. 
* документы / Файл CREDITS.txt. 
* 
* / 

namespace  phpbb \ auth \ provider \ oauth \ service ; 

/ ** 
* Bitly OAuth service 
* / 
class  bitly  extends  \ phpbb \ auth \ provider \ oauth \ service \ base 
{ 
    / ** 
    * phpBB config 
    * 
    * @var \ phpbb \ config \ config 
    * / 
    protected $ config ; 

    / ** 
    * запрос phpBB 
    * 
    * @var \ phpbb \ request \ request_interface 
    * / 
    protected  $ request ; 

    / ** 
    * Constructor 
    * 
    * @param \ phpbb \ config \ config $ config 
    * @param \ phpbb \ request \ request_interface $ request 
    * / 
    public  function  __construct ( \ phpbb \ config \ config  $ config ,  \ phpbb \ request \ request_interface  $ request ) 
    { 
        $ this -> config  =  $ config ; 
        $ this -> request =  $ request ; 
    } 

    / ** 
    * {@inheritdoc} 
    * / 
    public  function  get_service_credentials () 
    { 
        return  array ( 
            'key'      =>  $ this -> config [ 'auth_oauth_bitly_key' ], 
            'secret'   =>  $ this -> config [ 'auth_oauth_bitly_secret' ], 
        ); 
    } 

    / ** 
    * {@inheritdoc} 
    * / 
    public  function  perform_auth_login () 
    { 
        if  ( ! ($ this -> service_provider  instanceof  \ OAuth \ OAuth2 \ Service \ Bitly )) 
        { 
            throw  new  \ phpbb \ auth \ provider \ oauth \ service \ exception ( 'AUTH_PROVIDER_OAUTH_ERROR_INVALID_SERVICE_TYPE' ); 
        } 

        // Это был запрос обратного вызова из битлы, получить токен 
        $ this -> service_provider -> requestAccessToken ( $ this -> request -> variable ( 'code' ,  '' )); 

        // Отправить запрос с ним 
        $ result  =  json_decode ( $ this ->service_provider -> request ( 'user / info' ),  true ); 

        // Возвращаем уникальный идентификатор, возвращаемый с битового 
        возврата  $ result [ 'data' ] [ 'login' ]; 
    } 

    / ** 
    * {@inheritdoc} 
    * / 
    public  function  perform_token_auth () 
    { 
        if  ( ! ( $ this -> service_provider  instanceof  \ OAuth \ OAuth2 \ Service \ Bitly )) 
        { 
            throw  new  \ phpbb \ auth \ provider \ oauth \ service \ exception ('AUTH_PROVIDER_OAUTH_ERROR_INVALID_SERVICE_TYPE' ); 
        } 

        // Отправить запрос с ним 
        $ result  =  json_decode ( $ this -> service_provider -> request ( 'user / info' ),  true ); 

        // Возвращаем уникальный идентификатор, возвращаемый с битового 
        возврата  $ result [ 'data' ] [ 'login' ]; 
    } 
}

Файл службы

Чтобы phpBB мог правильно распознать файл сервиса, он должен быть записан в формате auth.provider.oauth.service.<service name>

services : 
    auth.provider.oauth.service.bitly : 
        class :  phpbb \ auth \ provider \ oauth \ service \ bitly 
        arguments : 
            -  '@config' 
            -  '@request' 
        теги : 
            -  {  name :  auth.provider.oauth.service  }