Я изо всех сил пытаюсь найти способ безопасного сохранения токена доступа, который мое веб-приложение получило из DiscordAPI после того, как пользователь авторизовал приложение.
Я создаю веб-интерфейс дляDiscord Bot.Здесь важно, что не каждый может его использовать.Только сервер-модераторы и тому подобное на конкретном сервере Discord должны иметь доступ к большинству частей сайта.Для этого я использую материал OAuth2 из Discord для получения токена доступа, с помощью которого я могу получить информацию о пользователе, например, его уникальный идентификатор.Идентификатор затем используется для проверки того, какие роли они выполняют на сервере Discord.
Теперь часть получения Access-Token уже записана в сценарии и, похоже, работает нормально.Я могу использовать токен для запроса данных из Discord API и т. Д.
Моя главная проблема - это безопасность.Я прочитал несколько разных постов, но у каждого, похоже, есть разные взгляды на это.
Одно «решение», о котором я часто читаю (даже на сайте Auth2), - это сохранение токена в cookie.
Здесь я не уверен, что это вообще безопасно.Я не могу просто сохранить токен только на сервере, потому что пользователь должен оставаться в журнале в течение срока действия токенов.Но хранение его в виде cookie-файла открывает его для атак (с которыми я недостаточно знаком для защиты).
У меня есть эта строка при получении токена:
res.cookie('authToken', response.access_token);
Я также настраиваю строку следующим образом, так как это указано для удаления всех способов считывания файлов cookie с помощью сценариев (этого достаточно?):
res.cookie('authToken', response.access_token, { httpOnly: true });
И при доступе к другим частям веб-интерфейса я проверяю, существует ли cookie, и пытаюсь спросить Discord о пользовательской информации с ним.Если информация о пользователе верна правильно, я предполагаю, что пользователь правильно аутентифицирован:
router.get('/', catchAsync(async (req, res, next) => {
if(req.cookies.authToken === undefined) {
// Render index view
res.render('index', {
authenticated: false
});
}
else {
// Grab the token
const localToken = req.cookies.authToken;
// Use the token to query user information
const response = await discordapi.GetDiscordUserDetails(localToken);
if(response.id) {
// Open the Index page and pass the username over
res.render('index', {
authenticated: true,
username: response.username,
userid: response.id,
avatarid: response.avatar
});
} else {
res.render('index', {
authenticated: false
});
}
}
}));
(«Идентифицированный» логический параметр, который я передаю, изменяет только видимость кнопки входа в документ html (экспресс-руль). Вы можетебольше ничего с этим не делаю.)
Теперь, когда мои ограниченные знания об этом, я в значительной степени предполагаю, что это худший способ сделать это, и я хочу улучшить (это).
Другим решением будет хранение токена доступа в базе данных на самом веб-сервере.Так что, по сути, никогда даже не показываю это пользователю.Однако тогда мне нужен способ сопоставления этого токена с пользователем, поэтому им все еще нужен какой-то файл cookie с информацией, которую я могу использовать для получения токена.Я предполагаю, что было бы оптимальным, если бы токен был зашифрован в базе данных, а у пользователя был ключ для его расшифровки.Однако тогда я не уверен, что это снова безопасно, потому что, если вы прочитаете куки, вы все равно сможете получить доступ к токену или, по крайней мере, действовать так, как будто вы именно этот пользователь.
куки на 100% безопаснее всего?Я очень новичок в этом, и хотя это, скорее всего, небольшой веб-интерфейс для одного простого сервера Discord, я все же хочу сделать это правильно.
Я также прочитал, что обработка токена как своего рода парольи завернуть его в другой слой «сессий» - это способ сделать это, но это звучит слишком сложно, и я бы даже не знал, с чего начать.
Я надеюсь, что кто-то может пролить свет на это,поскольку безопасность - это то, чего я действительно боюсь.
Спасибо за ваше время!