Моя авторизация пользователя отлично работает без authKey
. Я не понимаю, как его использовать. Но это как-то более безопасно использовать его в документации. Я реализовал эти методы в классе User ActiveRecord.
public function generateAuthKey()
{
$this->auth_key = Yii::$app->security->generateRandomString();
}
public function validateAuthKey($authKey)
{
return $this->authKey === $authKey;
}
Я даже сохраняю его в пользовательской таблице при создании пользователя. Но я знаю, что validateAuthKey
никогда не используется. Я использую сеансы, и только PHPSESSID отправляется пользователю. Должен ли я вручную устанавливать authKey
cookie для authKey
? В чем преимущества этого? Почему я не могу разрешать пользователю только PHPSESSID. Он уже хранится в таблице сеанса. Конфигурация сеанса:
'session' => [
'class' => 'yii\web\DbSession',
'sessionTable' => 'session',
],
Отвечает уже в Yii2: почему ключ auth в классе User?
См. Следующий исходный код (vendor\yiisoft\yii2\web\User.php
):
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__);
}
}