Токен бота: почему его нельзя хранить в коде
Почему токен не должен появляться ни в коде, ни в 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 остаётся инструментом для локальных проверок.