kotcich
@kotcich
Я скучный.

Как выполнять auto login пользователя с подключенным BasicAuth?

Мне нужно, чтобы после корректной авторизации пользователя, он оставался залогиненым не только до закрытия браузера, но и после. Иными словами, чтобы после закрытия браузера(но по прошествии малого кол-ва времени) при повторном заходе в систему не выскакивал alert с инпутами для логина и пароля.

Код аутентификации в behaviors:
'authenticator' => [
                'class' => \yii\filters\auth\HttpBasicAuth::class,
                'auth' => function ($username, $password) {
                    $user = User::find()->where(['username' => $username])->one();
                    if ($user && Yii::$app->getSecurity()->validatePassword($password, $user->password_hash)) {
                        if ($user->verification_token) {
                            return $user;
                        } else {
                            $token = Yii::$app->getSecurity()->generateRandomString();
                            $user->verification_token = $token;
                            $user->save();
                            $this->serializer['token'] = $token;
                            return $user;
                        }
                    } else {
                        return null;
                    }
                },
            ],


User модель в паке common не изменялась вообще (только implements IdentityInterface прописал).

Это мой строчки в main.php бэка для user компонента:

'user' => [
            'identityClass' => 'common\models\User',
            'enableAutoLogin' => true,
            'enableSession' => false,
            'identityCookie' => ['name' => '_identity-backend', 'httpOnly' => true],
        ],


Это мой fetch в js с уже отправленными логином и паролем, но аутентификация почему то понимает их только после ввода инфы в инпуты алерта. То есть сначала их нужно ввести, а уже потом этот фетч будет получать json без алерта (до закрытия браузера, после закрытия по новой все то же самое):

let username = 'admin';
        let password = '!QAZ2wsx';
        let headers = new Headers();
        headers.set('Authorization', 'Basic ' + btoa(username + ":" + password));
        fetch('http://back.ru/menu?tree=1', {
            credentials: "include",
            headers:  {
                headers
            },
        })
            .then(response => response.json()).then(data => { context.commit('SET_LIST', data) });
  • Вопрос задан
  • 50 просмотров
Решения вопроса 1
kotcich
@kotcich Автор вопроса
Я скучный.
По итогу выяснил, что сервер не видит headers, если они были отправленные через обьект new Headers()
, а когда я добавил headers вручную, вот так:
headers: {
'Authorization': 'Basic ' + btoa(username + ":" + password);
},

то сервер уже стал видеть отправленные данные.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы