Недавно я начал новый проект, который является проектом 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Дизайн и внешний вид тоже нуждаются в доработке.