Не обязательная аутентификация

Всё что касается построения API
Ответить
roker191
Сообщения: 15
Зарегистрирован: 2018.02.06, 14:44
Откуда: Харьков

Не обязательная аутентификация

Сообщение roker191 »

Есть action в контроллере, который отдает информацию, он использует данные пользователя при выборке информации с бд, работает отлично, по токену проходит аутентификацию, потом авторизацию и получаем информацию по пользователю. Но появилась задача, нужно отдавать некоторую публичную информацию, без аутентификации, правки в action я дописал, но без токена, как и должно быть, выкидывало на 401 ошибку, тогда в поведении аутентификации я дописал "'except' => ['мой_action']", все заработало хорошо, но, появилась проблема следующего характера, этот action теперь не проходит аутентификацию вообще, что по логике так и должно, раз я прописал его в except, а она там нужна, если таки передается токен. Есть ли вариант оформить логику так, что бы, если токен не приходит, аутентификация просто не проходила, а если приходит, то проходила как положено. В голове пока крутиться только создание отдельного action, но не хотелось бы, в одном очень удобно.
"Все было хорошо, пока программирование не стало работой"
roker191
Сообщения: 15
Зарегистрирован: 2018.02.06, 14:44
Откуда: Харьков

Re: Не обязательная аутентификация

Сообщение roker191 »

Сделал вот такой костыль, думаю, что есть лучший способ, если кто-то напишет, буду очень признателен.

С самого начала аутентификация была такая:

Код: Выделить всё

    public function behaviors()
	{
	    $behaviors = parent::behaviors();
	    $behaviors['authenticator'] = [
	        'class' => CompositeAuth::className(),
	        'authMethods' => [
                    HttpBasicAuth::className(),
                    HttpBearerAuth::className(),
	            QueryParamAuth::className(),
	        ],
	    ];

	    $behaviors['access'] = [
            'class' => AccessControl::className(),
            'rules' => [
                [
                    'allow' => true,
                    'roles' => ['@'],
                ],
            ],
        ];

	    return $behaviors;
	}
Что происходило, проходили все методы и не дав положительного итоге, выкидывало на ошибку 401, мол, не авторизованный.

Я добавил еще один класс авторизации:

Код: Выделить всё

use yii\filters\auth\AuthMethod;

class NoAuth extends AuthMethod
{

    public function authenticate($user, $request, $response)
    {

    	return true;
    }
}
И добавил отредактировал само поведение, добавив для некоторых actions возможность выполнения без авторизации

Код: Выделить всё

    public function behaviors()
	{
	    $behaviors = parent::behaviors();
	    $behaviors['authenticator'] = [
	        'class' => CompositeAuth::className(),
	        'authMethods' => [
                    HttpBasicAuth::className(),
                    HttpBearerAuth::className(),
	            QueryParamAuth::className(),
                    NoAuth::className(),
	        ],
	    ];

	    $behaviors['access'] = [
            'class' => AccessControl::className(),
            'rules' => [
                [
                    'allow' => true,
                    'roles' => ['@'],
                ],
                [
                    'actions' => ['my-actions'],
                    'allow' => true,
                    'roles' => ['?', '@'],
                ],
            ],
        ];

	    return $behaviors;
	}
Пройдя все методы аутентификации, последний отдаст true, типа, все окей, но в контроле доступа только нужным мне методам я разрешил выполняться без авторизации, таким образом все работает корректно, вроде)
"Все было хорошо, пока программирование не стало работой"
Ответить