Как лучше всего сохранить токен (JWT) в cakephp 4?

У меня есть проект, и я сделал бэкэнд с помощью nodejs. Я сделал модуль регистрации пользователя, и аутентификация генерирует токен! Этот токен нужно будет использовать в других запросах, где пользователь должен войти в систему.

Как лучше всего хранить этот токен на интерфейсе с помощью cakephp 4?

Есть какой-то компонент? Безопасно ли хранить этот токен с помощью сеанса?

Буду признателен, если кто-то поможет проанализировать этот случай.

Это мой метод аутентификации:

public function login()
    {
        $http = new Client();
        
        if ($this->request->is('post')) {
            $response = $http->post(
                'http://localhost:8889/api/auth/login',
                [
                    'email' => $this->request->getData("username"),
                    'password' => $this->request->getData("password"),
                ]
            );

            if ($response->getStatusCode() == 401) {
                return $this->redirect($this->referer());
            }

            if ($response->isOk()) {
                $json = $response->getJSON();
                    return $this->redirect(['action' => 'home', 'controller' => 'Pages']);
            }
        }
    }

Возврат 200 содержит accessToken.

🤔 А знаете ли вы, что...
Фреймворк обеспечивает интеграцию с различными системами хранения, включая Redis и Memcached.


1
69
1

Ответ:

Решено

Лучший способ сохранить токен — использовать файл cookie HttpOnly.

Согласно Microsoft Developer Network, HttpOnly является дополнительный флаг, включенный в заголовок HTTP-ответа Set-Cookie. С использованием флаг HttpOnly при создании файла cookie помогает снизить риск клиентский скрипт, обращающийся к защищенному файлу cookie (если браузер поддерживает его).

Если вы храните его в LocalStorage/SessionStorage, его можно легко захватить атакой XSS (со стороны Javascript/клиента)

В CakePHP 4 это делается следующим образом:

https://book.cakephp.org/4/en/controllers/request-response.html#creating-cookies

$cookie = new Cookie(
    'jwt_token', // name
    'token', // value
    new DateTime('+1 hour'), // expiration time
    '/', // path
    'example.com', // domain
    true, // secure only?
    true // http only -> this is what you need
);