Аутентификация для REST API Yii2

Аутентификацию будем проводить через поведения yii2 и дабы избежать "<мокрого" кода (см. подробнее) выведем контроллер с поведением в отдельный файл:

<?php

namespace app\components;

use yii\filters\auth\HttpBearerAuth;
use yii\filters\ContentNegotiator;
use yii\rest\Controller;
use Yii;
use yii\web\Response;

class ApiComponent extends Controller
{
    public function init()
    {
        parent::init();
        \Yii::$app->user->enableSession = false;
    }
    public function behaviors()
    {
        $behaviors = parent::behaviors();
        $behaviors['authenticator']['class'] = HttpBearerAuth::className();
        $behaviors['contentNegotiator'] = [
            'class' => ContentNegotiator::className(),
            'formats' => [
                'application/json' => Response::FORMAT_JSON,
            ],
        ];
        return $behaviors;
    }
}

В этом контроллере определим также поведение contentNegotiator, который определяет формат ответа.

Далее необходимо настроить модель пользователя в конфигурационном файле. Поскольку мы используем webvimark\UserManagement, модель пользователя в конфиге уже задана, поэтому дополним ее.

Файл config.php, раздел components:

'user' => [
      'class' => 'webvimark\modules\UserManagement\components\UserConfig',
      'identityClass' => 'app\models\User',
      'on afterLogin' => function($event) {
           \webvimark\modules\UserManagement\models\UserVisitLog::newVisitor($event->identity->id);
      }
],

Соответственно создаем класс app\models\User

<?php

namespace app\models;

use yii\web\IdentityInterface;

class User extends \webvimark\modules\UserManagement\models\User implements IdentityInterface
{
    public static function findIdentityByAccessToken($token, $type = null)
    {
        return static::findOne(['access_token' => $token]);
        //return $token == md5(\Yii::$app->params['apiHashString']) ? static::findOne(2) : NULL;
    }
}

Функция findIdentityByAccessToken должна возвращать объект User либо NULL если аутентификация провалена.

В случае когда API только выдает результаты и нет необходимости делить ее по пользователям, основной токен авторизации можно сохранить в параметрах конфигурации; создать пользователя с обычными правами и возвращать этого пользователя в функции findIdentityByAccessToken.

Теперь можно создавать контроллеры для API, наследуя их от компонента ApiComponent.

{{ message }}

{{ 'Comments are closed.' | trans }}