ACLClouds
ACLClouds

Токен бота: почему его нельзя хранить в коде

Почему токен не должен появляться ни в коде, ни в Git, и как читать его из переменных окружения в Python и Node.js.

Токен бота: это его пароль. Тот, кто им владеет, может войти вместо бота и действовать от его имени. Правило: токен живёт в окружении бота, никогда в коде, никогда в Git, никогда в сообщении.

  • Токен: это пароль: он не должен быть ни в коде, ни в Git, ни в сообщении.
  • Код читает DISCORD_TOKEN из окружения и ясно сообщает, если значение отсутствует.
  • Утёкший токен сбрасывается в портале разработчиков, и старый перестаёт работать.

Почему токен не место в коде

Токен, записанный в bot.py или index.js, попадает в каждую копию проекта, в историю Git, на скриншоты и в резервные копии. Достаточно одной утечки в любом из этих мест, чтобы бот оказался под угрозой.

  • Публичный репозиторий Git показывает токен всем, даже после удаления файла: история его сохраняет.
  • Если токен утёк, сразу сбросьте его в портале разработчиков Discord: старый перестанет работать.
  • Токен, вставленный в сообщение поддержки или в канал Discord, тоже раскрыт: никогда не копируйте его туда.

Чтение токена из окружения

Переменная окружения: это значение, которое система передаёт программе при запуске. Код читает его по имени, а токен остаётся вне проекта.

  • Python: импортируйте os, затем token = os.environ["DISCORD_TOKEN"] и bot.run(token).
  • Node.js: client.login(process.env.DISCORD_TOKEN), без чего-либо ещё в файле.
  • Локально файл .env может содержать DISCORD_TOKEN=votre_token; добавьте его в .gitignore, чтобы он никогда не попал в коммит.

Проверка и реакция

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

  • Python: if not token: raise SystemExit("Не задан DISCORD_TOKEN") до запуска клиента.
  • Node.js: if (!process.env.DISCORD_TOKEN) throw new Error("Не задан DISCORD_TOKEN");
  • Код закрытия шлюза 4004 или LoginFailure: токен неверен или был сброшен. Проверьте переменную, не копируя её никуда.

Почему ACLClouds хранит токен вне репозитория

Токен вводится в пространстве бота в панели ACLClouds, а не в коде. Поле также отказывает в токене, введённом как имя переменной.

  • Токен вводится в панели бота и не записывается в файлы проекта.
  • Поле отказывает в имени переменной вроде DISCORD_TOKEN, введённом вместо токена, чтобы избежать ошибки копирования.
  • Доступ SFTP для каждого бота на порту 2222: код загружается сам, без секретов внутри.

Часто задаваемые вопросы

Можно ли записать токен в файл конфигурации проекта?

Нет, даже в файл, который кажется безобидным. Храните его в окружении или в панели, а в репозитории держите только шаблон .env.example без значения.

Я случайно опубликовал токен. Что делать?

Сразу сбросьте его в портале разработчиков Discord, обновите переменную у бота и перезапустите его. Удаления файла недостаточно: история Git его сохранит.

Безопасен ли файл .env на сервере?

Его не нужно загружать вместе с кодом. На боте лучше использовать значения, введённые в панели: .env остаётся инструментом для локальных проверок.