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