Двойной токен дизайн дизайна входа пользователя

внешний интерфейс
Двойной токен дизайн дизайна входа пользователя

Недавно я начал новый проект, который является проектом toC. Предыдущий интерфейс входа был написан стажером. Иногда другой коллега просматривал код проекта и говорил мне, что для повышения безопасности интерфейс входа был изменен. . .

задний план

Интерфейс входа в систему перед проектом, над которым я работал, был написан стажером.Дизайн входа в систему заключается в том, чтобы просто отправить имя пользователя и пароль для получения токена, а затем срок действия токена составляет 30 дней, поэтому другой коллега, который работал немного дольше.Изменил код для входа в систему, чтобы получить два токена:

  • 1.accessToken: Фактическое разрешение на получение данных
  • 2.refreshToken: получитьaccessToken

Зачем нужен двойнойtoken?

хорошо известно,tokenЭто сделано для предотвращения распространения и кражи пользовательской информации, но еслиtokenНет времени истечения или время истечения очень долгое, тогда очевидноtokenБыть украденным небезопасно.tokenтеряет смысл.

Так что в это время все должны думать: тогдаtokenСрок годности установлен короче?

Да вообще говоряaccessTokenВремя истечения должно быть короче, но это будет хлопотно для пользователя в это время.

потому чтоtokenСрок действия означает, что вы должны снова войти в систему.Представьте, что вы хорошо просматриваете, и вдруг вас отключают и просят войти снова.Вы, должно быть, ругаетесь.

Когда пользователям необходимо повторно войти в систему?

Есть три основных случая:

  • 1. Если пользователь не работает в течение длительного времени, или вы можете определить неактивных пользователей, они будут автоматически удалены и автоматически перенаправлены на страницу входа.Период ожидания может быть настроен;
  • 2. Токен недействителен, обычно после того, как оба токена станут недействительными, вам будет предложено снова войти в систему, чтобы получить новый двойной токен;
  • 3. При обнаружении риска вы можете снова запросить вход для получения токена;

Таким образом, вы можете использовать двойнойtokenдизайн, когда дваtokenистекли, а затем требуют от пользователя повторного входа в систему.refreshToken, который используется только для полученияaccessToken, не часто используется для запросов, дляaccessToken, время его истечения очень мало, даже если его перехватить и расшифровать, потребуется время, иtokenКроме того, срок его действия быстро истекает, поэтому такой дизайн более безопасен.

Так все весело? Очевидно, что не в качестве внешнего интерфейса, нам также необходимо понимать, что пользователи могут использоватьrefreshTokenПолучатьaccessTokenОперация нечувствительна, чтобы обеспечить большую безопасность и разумность, не влияя на работу пользователя.

Как добитьсяrefreshTokenПолучатьtokenОбновить без чувств?

Вообще говоря, есть три метода:

  • 1. Возвращает время истечения через серверную часть, а внешний интерфейс делает оценку на основе текущего времени и времени истечения срока действия и вызывает интерфейс токена обновления.

    Недостатки: бэкенд должен предоставить дополнительное поле для времени истечения срока действия токена; локальное время используется для оценки, если локальное время подделано, особенно когда локальное время медленнее, чем время сервера, перехват не удастся.

  • 2. Запланированные задачи, используйте регулярноrefreshTokenПолучатьaccessToken

    Это тратит ресурсы и потребляет производительность, и это не рекомендуется.

  • 3. Сделайте перехват в ответном перехватчике, заднее суждениеtokenПо истечении срока возврата вызовите интерфейс токена обновления.

    Лучшим решением также является решение, которое я использую в проекте, и у axios есть API для перехвата ответа.

Вот простая демонстрация реализации:

import axios from 'axios';

axios.interceptors.response.use(res => {
        // token异常
        if (res.data.code === 409) {
            deleteToken();
            router.push('/login')
            return Promise.reject();
            // 更新Token
        } else if (res.data.code === 410) {
            const {token} = res.data
            setToken(token);// 重置token
        }
        return res && res.data
    }
)

Суммировать

Поэтому для безопасности пользователя используйтеtokenДизайн, чтобы решить проблему частого входа пользователя, используйте двойнойtokenДизайн и внешний вид тоже нуждаются в доработке.