Next.js обрабатывает ротацию refresh-токенов на стороне клиента.

Вопрос или проблема

Итак, я работаю над небольшим веб-приложением для управления задачами с системой аутентификации. Это реализовано через ротацию refresh-токенов и access-токены (оба jwt). Я внедрил ограничение маршрутов в промежуточном ПО, но теперь у меня есть одна проблема. Как мне узнать со стороны клиента, что access-токен истек, и мне нужно получить новый через refresh-токен? Есть ли способ получить код ответа страницы до ее отображения, чтобы я мог определить, что бэкенд-API вернул сообщение о том, что токен недействителен, и мне нужно получить новый access-токен перед повторным запуском запроса?
Я использую следующую версию 14.2.13.

Я пробовал что-то с getServerSideProps, но это не сработало, так как он сообщает, что getServerSideProps" не поддерживается в app/ (так как я использую роутер приложения).

Я довольно нов в next.js и чувствую, что зашёл в тупик.

Спасибо заранее!

Ответ или решение

Для разработки клиентской части приложения на Next.js с использованием ротации refresh-токенов и доступа через JWT нужно учесть несколько аспектов, связанных с обработкой состояния аутентификации и обновлением токенов. Ваш вопрос касается того, как определить, что access-токен истек и нужно получить новый токен с помощью refresh-токена. Давайте рассмотрим шаги и подходы к решению этой задачи.

1. Введение в ротацию токенов

Ротация токенов — это метод управления аутентификацией, при котором access-токены имеют короткое время жизни, а refresh-токены дольше. Когда access-токен истекает, его следует обновить с помощью refresh-токена. Важно, чтобы refresh-токены также имели механизмы защиты, чтобы предотвратить их компрометацию.

2. Обработка истекшего access-токена на клиенте

Вам необходимо реализовать логику на стороне клиента, которая будет контролировать состояние access-токена и автоматически инициировать его обновление при необходимости. Основные шаги следующие:

2.1. Хранение токенов

Сохраните access-токен и refresh-токен в localStorage или sessionStorage. Это позволит вам получать токены как для запросов к API, так и для их проверки.

// Пример хранения токенов
localStorage.setItem('access_token', yourAccessToken);
localStorage.setItem('refresh_token', yourRefreshToken);

2.2. Проверка истечения токена

Вам нужно реализовать функцию, которая будет проверять срок действия access-токена перед отправкой запроса к вашему API:

const isAccessTokenExpired = (token) => {
    const decoded = jwtDecode(token); // Используйте библиотеку для декодирования
    return Date.now() >= decoded.exp * 1000; // Проверяет, истек ли токен
};

2.3. Автообновление токена

Если вы обнаружите, что access-токен истек, инициируйте запрос на обновление с использованием refresh-токена. Например:

const refreshAccessToken = async () => {
    const response = await fetch('/api/refresh-token', {
        method: 'POST',
        headers: {
            'Content-Type': 'application/json'
        },
        body: JSON.stringify({ refresh_token: localStorage.getItem('refresh_token') })
    });

    if (response.ok) {
        const data = await response.json();
        localStorage.setItem('access_token', data.access_token); // Сохраните новый токен
    } else {
        // Обработка ошибки, например, выход из системы
    }
};

3. Обработка ответов от API

Чтобы знать, когда происходят ошибки из-за истекшего токена, вам нужно обрабатывать код ответа API. Например, если ваш сервер возвращает код 401 (Unauthorized), это может означать, что access-токен невалиден:

const fetchWithAuth = async (url, options) => {
    let accessToken = localStorage.getItem('access_token');

    let response = await fetch(url, {
        ...options,
        headers: {
            ...options.headers,
            Authorization: `Bearer ${accessToken}`
        }
    });

    // Проверка на истекший access-токен
    if (response.status === 401) {
        await refreshAccessToken(); // Пытаемся обновить токен
        accessToken = localStorage.getItem('access_token'); // Получаем новый токен

        // Повторяем запрос с новым токеном
        response = await fetch(url, {
            ...options,
            headers: {
                ...options.headers,
                Authorization: `Bearer ${accessToken}`
            }
        });
    }

    return response;
};

4. Использование middleware в Next.js

С помощью middleware в Next.js вы можете управлять доступом к страницам и защищать их от неавторизованного доступа. Это также может быть полезно для проверки актуальности токенов при их использовании на серверной стороне:

// Ваш middleware
export const middleware = async (req) => {
    const token = req.cookies.token; // Ищем токен в куки

    if (!token || !isAccessTokenExpired(token)) {
        return NextResponse.redirect('/login'); // Перенаправление при невалидном токене
    }

    return NextResponse.next(); // Если все в порядке
};

5. Заключение

Работа с токенами на клиентской части требует внимательного планирования. Использование подходов, описанных выше, поможет вам реализовать ротацию refresh-токенов и правильное управление доступом к вашему API. Настройка проверки токенов и автообновление помогут избежать прерываний в работе вашего приложения при изменении состояния аутентификации пользователя.

Надеюсь, это поможет вам продвигаться вперед в разработке вашего приложения на Next.js! Если у вас появятся дополнительные вопросы, не стесняйтесь их задавать.

Оцените материал
Добавить комментарий

Капча загружается...