Авторизация логин + пароль и AccessControl

Всё что касается построения API
Ответить
Аватара пользователя
MOTORIST
Сообщения: 245
Зарегистрирован: 2010.06.24, 10:04

Авторизация логин + пароль и AccessControl

Сообщение MOTORIST »

Всем привет и С Новым годом!
Решил по изучать Angular и за одно пощупать REST API Yii2. Клиент и сервер на одном домене. Решил оставить базовую авторизацию и не заморачиваться с токеном. Все запустилось, все работает, кроме AccessControl. Почему то выдает Unauthorized (#401) + выкидывает alert с формой авторизации.
Модель User базовая.
Контроллер

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

class AlbumsController extends \yii\rest\ActiveController
{
    public $modelClass = 'frontend\models\Albums';

    public function behaviors()
    {
        $behaviors['authenticator'] = [
            'class' => HttpBasicAuth::className(),
            'auth'=>function ($username, $password) {
                    return User::findOne([
                        'username' => $username,
                        'password_hash' => $password,
                    ]);
            },
        ];

        $behaviors['access'] = [
            'class' => AccessControl::className(),
            'only' => ['index'],
            'rules' => [
                [
                    'allow' => true,
                    'actions' => ['index'],
                    'roles' => ['?'],
                ],
                [
                    'allow' => true,
                    'actions' => ['view','update','delete'],
                    'roles' => ['@'],
                ],
            ],
        ];

        return $behaviors;
    }

}


Конфиг

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

return [
    'id' => 'app-frontend',
    'basePath' => dirname(__DIR__),
    'bootstrap' => ['log'],
    'controllerNamespace' => 'frontend\controllers',
    'components' => [
        'user' => [
            'identityClass' => 'common\models\User',
            'enableAutoLogin' => true,
        ],
        'log' => [
            'traceLevel' => YII_DEBUG ? 3 : 0,
            'targets' => [
                [
                    'class' => 'yii\log\FileTarget',
                    'levels' => ['error', 'warning'],
                ],
            ],
        ],
        'errorHandler' => [
            'errorAction' => 'site/error',
        ],
        'request' => [
            'class' => '\yii\web\Request',
            'enableCookieValidation' => false,
            'parsers' => [
                'application/json' => 'yii\web\JsonParser',
            ],
        ],
        'urlManager' => [
            'enablePrettyUrl' => true,
            'enableStrictParsing' => true,
            'showScriptName' => false,
            'rules' => [
                ['class' => 'yii\rest\UrlRule', 'controller' => 'albums'],
                'POST site/login' => 'site/login',
                'POST site/logout' => 'site/logout',
            ],
        ]
    ],
    'params' => $params,
];
В сознании новичка много возможностей, в сознании эксперта — лишь несколько.
Аватара пользователя
yiijeka
Сообщения: 3103
Зарегистрирован: 2012.01.28, 09:14
Откуда: Беларусь
Контактная информация:

Re: Авторизация логин + пароль и AccessControl

Сообщение yiijeka »

'enableAutoLogin' => true, нужно отключать для REST и проверять пользователя при каждом запросе.
'only' => ['index'],
Аватара пользователя
MOTORIST
Сообщения: 245
Зарегистрирован: 2010.06.24, 10:04

Re: Авторизация логин + пароль и AccessControl

Сообщение MOTORIST »

Мне нужно чтобы здесь проверялось:

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

$behaviors['access'] = [
            'class' => AccessControl::className(),
            'only' => ['index'],
            'rules' => [
                [
                    'allow' => true,
                    'actions' => ['index'],
                    'roles' => ['?'],
                ],
                [
                    'allow' => true,
                    'actions' => ['view','update','delete'],
                    'roles' => ['@'],
                ],
            ],
        ];
 
Почему то не работает и не одного меня.
Я понимаю что у меня не совсем REST API, но хотелось бы иметь стандартную авторизацию и базовый функционал REST API (Yii 2.x).
В сознании новичка много возможностей, в сознании эксперта — лишь несколько.
Аватара пользователя
yiijeka
Сообщения: 3103
Зарегистрирован: 2012.01.28, 09:14
Откуда: Беларусь
Контактная информация:

Re: Авторизация логин + пароль и AccessControl

Сообщение yiijeka »

Стандартная авторизация с разрешением базового функционала называется по сути OAuth2.
http://www.yiiframework.com/doc-2.0/yii ... auth2.html

Для REST нужно проверять пользователя при каждом запросе с выключенным 'enableAutoLogin'.

'only' => ['index'],
/**
* @var array list of action IDs that this filter should apply to. If this property is not set,
* then the filter applies to all actions, unless they are listed in [[except]].
* If an action ID appears in both [[only]] and [[except]], this filter will NOT apply to it.
*
* Note that if the filter is attached to a module, the action IDs should also include child module IDs (if any)
* and controller IDs.
*
* @see except
*/
public $only;
sda
Сообщения: 334
Зарегистрирован: 2013.12.19, 09:29

Re: Авторизация логин + пароль и AccessControl

Сообщение sda »

yiijeka, ты можешь сказать почему при REST все пишут, что нужно обязательно озаботиться, чтобы данные передавались через HTTPS, а когда пишем обычный php-сайт то об этом вообще никто не упоминает? Вот говорят, что при HTTP на любом узле между клиентом и сервером можно сделать MITM attack и украсть/подменить данные. Хорошо, а какая разница REST сервер или обычный php-сайт, данные же можно украсть/подменить в любом из этих случаев. Но почему-то только о REST слышно, что он должен обязательно использовать HTTPS. Или это как-то связано с тем, что для нашего REST-сервера могут писать клиенты другие люди? Насколько это вообще реальная угроза на счет MITM attack, ведь более 60% сайтов сейчас не используют HTTPS и чувствуют себя нормально. А я так понял, что при HTTP в случае с REST могут украсть токен и юзать чужой акк. Хорошо, а на обычном php-сайте нельзя чтоли сессионную куку украсть точно таким же способом и тоже юзать чужой акк?

Объясните суть. Спасибо.
lynicidn
Сообщения: 2222
Зарегистрирован: 2014.05.24, 15:12

Re: Авторизация логин + пароль и AccessControl

Сообщение lynicidn »

думаю это связано с тем что логин и пароль передаются в открытом виде, и так же зная алгоритм формирования аутх_кей можно уже ущапать уязвимости, а в простом приложении все же есть сессии и куки, где часть данных более менее надежна
sda
Сообщения: 334
Зарегистрирован: 2013.12.19, 09:29

Re: Авторизация логин + пароль и AccessControl

Сообщение sda »

lynicidn, скажи я правильно понял, что для аутентификации пользователя, можно на клиенте показать форму входа, затем пользователь пишет логин и пароль и отправляет эти данные на сервер, сервер ищет в бд пользователя с таким логином и паролем и в случае успеха отдает клиенту например json с данными, это может быть пара username/password для HttpBasicAuth или access_token для QueryParamAuth, после чего клиент сохраняет эти данные у себя и с этого момента при запросе api, который требует аутентификацию просто отсылает эти данные вместе с запросом. Верно?
sda
Сообщения: 334
Зарегистрирован: 2013.12.19, 09:29

Re: Авторизация логин + пароль и AccessControl

Сообщение sda »

lynicidn, спасибо. Тогда скажи, правильно ли я понял, что в общем случае REST не совсем подходит для real-time приложений, потому что REST работает по протоколу HTTP, а real-time приложение будет использовать протокол WebSocket. То есть я имею ввиду, что в таком случае нельзя слать rest-запросы напрямую из клиента, поскольку в таком случае невозможно убедиться, что пользователь сейчас онлайн, а REST API должен подразумевать (в уме, но не в коде), что пользователь находится онлайн. И тут можно попробовать использовать следующую схему Client -> Server (WebSocket) -> REST API Server, то есть теперь клиент не может напрямую общаться с REST API, а может только установить соединение с сервером по протоколу WebSocket и получать/отправлять данные с/на сервер (WebSocket), а вот уже сервер (WebSocket) прежде чем отправить нужные данные клиенту, может запросить их по HTTP с REST-сервера. Или же вообще просто отказаться от использования REST. Верно?
lynicidn
Сообщения: 2222
Зарегистрирован: 2014.05.24, 15:12

Re: Авторизация логин + пароль и AccessControl

Сообщение lynicidn »

не совсем так, в целом верно про понимание реал тайм. Но рест не должен ничего подразумевать, он либо шлет логин и пароль, либо если в его локальном хранилище где то записан auth_key. Да, в вашем примере рест не нужен, если вы не хотите выделить апи проекта для каких либо еще целей. Звучит конечно глупо, но поверьте я видел проект в котором обычное веб апп шлет курлом запросы на апи, т.е. аля изобрели wsdl
sda
Сообщения: 334
Зарегистрирован: 2013.12.19, 09:29

Re: Авторизация логин + пароль и AccessControl

Сообщение sda »

lynicidn, спасибо за разъяснения.
Ответить