Аутентификация authKey

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Ответить
sda
Сообщения: 334
Зарегистрирован: 2013.12.19, 09:29

Аутентификация authKey

Сообщение sda »

Здравствуйте. Хочу начать делать аутентификацию. Прочитал эту статью, а также ознакомился с yii\web\User и yii\web\IdentityInterface, а также посмотрел примеры реализации аутентификации в basic и advanced. Возник вопрос по поводу authKey. В примерах приложений я не увидел, чтобы authKey где-то регенерировался каждый раз заново при успешной аутентификации. В документации к yii2 тоже не нашел упоминания о том, что так нужно делать, в отличии от документации по yii1 где об этом прямо сказано
Если пользователь входит через форму ещё раз, ключ регенерируется.
У меня вопрос, нужно ли в yii2 регенерировать ключ после каждой успешной аутентификации (как это рекомендовалось делать для yii1) ? Или для yii2 это уже не актуально и если так то расскажите почему, поскольку судя по беглому просмотру исходного кода, это попрежнему актуально, как и для yii1.
sda
Сообщения: 334
Зарегистрирован: 2013.12.19, 09:29

Re: Аутентификация authKey

Сообщение sda »

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

protected function loginByCookie()
    {
        $value = Yii::$app->getRequest()->getCookies()->getValue($this->identityCookie['name']);
        if ($value === null) {
            return;
        }
        $data = json_decode($value, true);
        if (count($data) !== 3 || !isset($data[0], $data[1], $data[2])) {
            return;
        }
        list ($id, $authKey, $duration) = $data;
        /* @var $class IdentityInterface */
        $class = $this->identityClass;
        $identity = $class::findIdentity($id);
        if ($identity === null) {
            return;
        } elseif (!$identity instanceof IdentityInterface) {
            throw new InvalidValueException("$class::findIdentity() must return an object implementing IdentityInterface.");
        }
        if ($identity->validateAuthKey($authKey)) {
            if ($this->beforeLogin($identity, true, $duration)) {
                $this->switchIdentity($identity, $this->autoRenewCookie ? $duration : 0);
                $ip = Yii::$app->getRequest()->getUserIP();
                Yii::info("User '$id' logged in from $ip via cookie.", __METHOD__);
                $this->afterLogin($identity, true, $duration);
            }
        } else {
            Yii::warning("Invalid auth key attempted for user '$id': $authKey", __METHOD__);
        }
    }
Потому что исходя из этого кода, достаточно чтобы в куке был только верный $id и $authKey, этого достаточно, чтобы аутентифицироваться по куке, но в ней может содержаться другая уже устаревшая информация или куку может украсть злоумышленник и без проблем входить в систему под чужим аккаунтом. И сделать то ничего нельзя, если не регенерируется $authKey, верно?
sda
Сообщения: 334
Зарегистрирован: 2013.12.19, 09:29

Re: Аутентификация authKey

Сообщение sda »

Вот ответ https://github.com/yiisoft/yii2/issues/ ... t-57328569 гласящий о том, что authKey регенерировать нужно, наверное об этом бы следовало в документации упомянуть (или может я просто не увидел).

Тем более в advanced я нашел, что authKey создается однажды при регистрации и потом нигде не регенерируется, то есть по-сути статичный, а значит и смысла в нем в таком случае никакого, так как кука бессмертная.

Ну или я чего-то не понимаю. :(
dmeroff
Сообщения: 101
Зарегистрирован: 2012.06.05, 14:32
Откуда: Петрозаводск
Контактная информация:

Re: Аутентификация authKey

Сообщение dmeroff »

Вы чего-то не понимаете.
Насколько мне известно, authKey вводит дополнительный уровень безопасности кук (собственно об этом и говорит Qiang по ссылке, которую вы привели). То есть при каждом обращении к сайту, из базы дергается этот authKey и сверяется с записанным в куках, если они равны, то все нормально, если нет, то пользователь будет автоматически разлогинен.
По ссылке, которую вы привели, написано, что регенерировать authKey МОЖНО (а не нужно) для того, чтобы инвалидировать куку логина.
sda
Сообщения: 334
Зарегистрирован: 2013.12.19, 09:29

Re: Аутентификация authKey

Сообщение sda »

Ну да он написал что можно. Да authKey из кук сверяется с тем, что в базе. Но я говорю о том, что если authKey не регенерируется (например при каждой успешной аутентификации), то кука по-сути бессмертная и от authKey смысла ровно ноль. В таком случае, если у пользователя украли куку, что он будет делать? У него нет никакой возможности сделать эту куку невалидной, вот например как в advanced.
dmeroff
Сообщения: 101
Зарегистрирован: 2012.06.05, 14:32
Откуда: Петрозаводск
Контактная информация:

Re: Аутентификация authKey

Сообщение dmeroff »

authKey защищает куки не от кражи, а от подделки (об этом и говорит Qiang - "authKey will still help to make sure you cannot make up a cookie"). В качестве защиты от кражи кук используется cookie validation. То есть куки шифруются с помощью ключа, указанного в cookieValidationKey (у компонента request).
sda
Сообщения: 334
Зарегистрирован: 2013.12.19, 09:29

Re: Аутентификация authKey

Сообщение sda »

/**
* @var boolean whether cookies should be validated to ensure they are not tampered. Defaults to true.
*/
public $enableCookieValidation = true;
dmeroff, а я то думал что всё наоборот, что $enableCookieValidation чтобы защититься от подделки кук, а оказывается, разработчики yii2 всё напутали и совсем не о том в docblock написали. Спасибо, что подсказали. Не желаете ли пулл риквест сделать? :mrgreen:
Ramix
Сообщения: 26
Зарегистрирован: 2012.07.18, 16:19

Re: Аутентификация authKey

Сообщение Ramix »

dmeroff писал(а):Вы чего-то не понимаете.
То есть при каждом обращении к сайту, из базы дергается этот authKey и сверяется с записанным в куках, если они равны, то все нормально, если нет, то пользователь будет автоматически разлогинен.
Вы не ошиблись? Вроде сейчас нет такого поведения (хотели добавить, обсуждали). Т.е. auth_key не сверяется при каждом (!) запросе. Указанное вами поведение устраивает, привел к такому же виду. Но это не из коробки.
Onotole
Сообщения: 1808
Зарегистрирован: 2012.12.24, 12:49

Re: Аутентификация authKey

Сообщение Onotole »

Ramix писал(а):
dmeroff писал(а):Вы чего-то не понимаете.
То есть при каждом обращении к сайту, из базы дергается этот authKey и сверяется с записанным в куках, если они равны, то все нормально, если нет, то пользователь будет автоматически разлогинен.
Вы не ошиблись? Вроде сейчас нет такого поведения (хотели добавить, обсуждали). Т.е. auth_key не сверяется при каждом (!) запросе. Указанное вами поведение устраивает, привел к такому же виду. Но это не из коробки.
Все эти полтора года он ждал именно твоего ответа
Ramix
Сообщения: 26
Зарегистрирован: 2012.07.18, 16:19

Re: Аутентификация authKey

Сообщение Ramix »

Мне всё-равно когда был написан предыдущий комментарий, хоть 10 лет назад. В этой теме велось определенное обсуждение и я его продолжил. Писать в эту тему нельзя? Так закрой ее, ты ж модер.
LDN
Сообщения: 62
Зарегистрирован: 2014.07.28, 10:13

Re: Аутентификация authKey

Сообщение LDN »

Я вот подумал, что ситуация, когда пользователь может быть залогиненным в разных браузерах не очень безопасная.
Т.е. например, когда человек с чужого компьютера заходит, и забывает выйти из пользователя. Или один компьютер общий в семье (сейчас конечно редкость, но были годы, когда это было нормой).

Думаю, дай посмотрю, на что влияет этот auth_key.

Вошел под одним пользователем в Chrome, под тем же пользователем в Firefox ("с параметром запомнить меня").
Потом зашел в БД, поменял значение auth_key.
Проверяю Chrome и Firefox, пользователь в системе остался. Подумал, что тут вроде ничего страшного, сессия то продолжается.
Я закрыл вкладку с сайтом, закрыл Chrome, зашел на сайт, пользователь не в системе, думаю, здорово. Всё работает, как я и думал. Думаю, сейчас запилю при входе на сайт пользователя перегенерацию auth_key, и будет мне счастье.
Я закрыл вкладку с сайтом, закрыл Firefox, зашел на сайт, пользователь в системе. И понял, что я ничего не понимаю. То ли баг, то ли оно работает, не так как я думал. Зачем этот auth_key тогда нужен?...

Yii 2.0.15.1
Аватара пользователя
Dominus
Сообщения: 892
Зарегистрирован: 2013.03.14, 21:27
Откуда: Россия, Иваново
Контактная информация:

Re: Аутентификация authKey

Сообщение Dominus »

auth_key нужен например для RESTful api, играет роль как access_token
https://github.com/yiisoft/yii2/blob/ma ... ication.md
Не спорь с дураком, иначе окружающие не правильно поймут кто из вас дурак!
Аватара пользователя
ElisDN
Сообщения: 5845
Зарегистрирован: 2012.10.07, 10:24
Контактная информация:

Re: Аутентификация authKey

Сообщение ElisDN »

LDN писал(а): 2018.05.19, 09:07 Зачем этот auth_key тогда нужен?...
Фреймворк для аунтентификации:

1. Смотрит id юзера в сессии. Если не нашлось, то...
2. Смотрит id и auth_key в куках. Туда они сохраняются только при "Запомнить меня".

Сессия по умолчанию живёт один час.
Prowler
Сообщения: 1
Зарегистрирован: 2018.07.04, 15:22

Re: Аутентификация authKey

Сообщение Prowler »

Интересное дело. В advenced зарегил пользователя, добавил adminLTE, доступа на регистрацию нету ни на backend ни на frontend. Все ок.
Но понадобилось таки сменить пароль единственному пользователю backend'а. Ок, нашел генерацию, вывел, в базу сохранил. Хорошо казалось бы, все? А вот нифига. Пароль сменен, но пользователи залогененные под этим пользователем ранее спокойно продолжают работать. Удалил auth_key - никакого эффекта. Спокойно продолжаем работу. Кстати, не знаю где настраивается время сессии, не трогал с создания сайта - один раз зашел и живет бесконечно, уже с месяц точно. Почистил куки - выкинуло. Авторизовался с новым паролем - auth_key как был пустой так и остался. Нет никакого толку от него. Да и вообще такое поведение авторизации "из коробки" очень глупое.
Аватара пользователя
webplus
Сообщения: 336
Зарегистрирован: 2012.02.24, 22:05

Re: Аутентификация authKey

Сообщение webplus »

LDN писал(а): 2018.05.19, 09:07 Вошел под одним пользователем в Chrome, под тем же пользователем в Firefox ("с параметром запомнить меня").
Потом зашел в БД, поменял значение auth_key.
Проверяю Chrome и Firefox, пользователь в системе остался.
Здравствуйте!
Вы правы валидация auth_key не где не срабатывала!
Вчера написал компонент который базовый наследует, но с небольшими правками. вот он https://github.com/borysenko/yii2-user-component
Попробуйте сменить auth_key в бд и вас тут же разлогинет.
Сайт по работе в Украине: https://jobis.com.ua/. Сайт по поиску строителей: https://stroyzakaz.com.ua/
Создание сайтов в Киеве: https://webplus.com.ua/ по доступной цене.
Ответить