Git Credentials Management¶
Обзор¶
tg-note поддерживает безопасное хранение и использование персональных Git credentials (GitHub и GitLab токенов) для каждого пользователя. Это позволяет:
- 🔐 Безопасное хранение: Токены шифруются с помощью Fernet (AES-128)
- 👥 Мультипользовательский режим: Каждый пользователь может иметь свои токены
- 🌐 Поддержка GitHub и GitLab: Работа с обеими платформами
- 🚀 Простое управление: Команды в Telegram для добавления/удаления токенов
Зачем это нужно?¶
При работе с Git через HTTPS необходима аутентификация. Проблема хранения токена в .env файле:
❌ Один токен на всех - все пользователи используют один и тот же токен ❌ Небезопасная передача - передача токена через другие каналы может быть небезопасной ❌ Сложное управление - нужно редактировать файлы на сервере
✅ Решение: Персональные зашифрованные токены для каждого пользователя
Безопасность¶
Как хранятся токены?¶
- Шифрование: Все токены шифруются с помощью Fernet (симметричное шифрование, AES-128)
- Ключ шифрования: Хранится в файле
./data/.credentials_keyс правами доступа600(только владелец может читать) - Зашифрованные данные: Хранятся в
./data/user_credentials.encс правами доступа600 - Блокировка файлов: Используется file locking для предотвращения race conditions
Рекомендации по безопасности¶
✅ DO:
- Создавайте токены с минимально необходимыми правами (repo для GitHub, write_repository для GitLab)
- Устанавливайте срок действия токенов
- Удаляйте сообщения с токенами после отправки боту
- Используйте разные токены для разных проектов
❌ DON'T: - Не передавайте токены через незащищенные каналы - Не используйте токены с полным доступом ко всему аккаунту - Не сохраняйте токены в общедоступных местах
Команды управления¶
/settoken - Добавить токен¶
Команда для безопасного добавления Git токена.
Процесс:
- Выполните
/settokenв чате с ботом - Выберите платформу (GitHub или GitLab)
- Введите ваш username
- Введите ваш Personal Access Token
Пример:
/settoken
→ Выбрать: GitHub
→ Ввести: john_doe
→ Ввести: ghp_xxxxxxxxxxxxxxxxxxxx
→ ✅ Токен сохранен и зашифрован
Автоматическое удаление: После отправки токена, сообщение автоматически удаляется для безопасности.
/listcredentials - Просмотр токенов¶
Показывает информацию о сохраненных токенах (без раскрытия самих токенов).
Пример вывода:
🔐 Сохраненные Git Credentials
🐙 GITHUB
• Username: john_doe
• Token: ✅ Установлен
• Remote: https://github.com/user/repo
🦊 GITLAB
• Username: jane_smith
• Token: ✅ Установлен
/removetoken - Удалить токен¶
Удаляет сохраненные токены.
Варианты:
- Удалить токен для конкретной платформы (GitHub или GitLab)
- Удалить все токены сразу
Пример:
Получение токенов¶
GitHub Personal Access Token¶
- Перейдите на GitHub Settings → Developer settings → Personal access tokens
- Нажмите "Generate new token" → "Generate new token (classic)"
- Укажите название токена (например, "tg-note bot")
- Выберите scope:
repo(Full control of private repositories) - Опционально: установите срок действия токена
- Нажмите "Generate token"
- Скопируйте токен (он будет показан только один раз!)
Необходимые права:
- ✅ repo - для работы с приватными репозиториями
GitLab Personal Access Token¶
- Перейдите на GitLab Settings → Access Tokens
- Укажите название токена (например, "tg-note bot")
- Выберите scopes:
write_repository - Опционально: установите срок действия токена
- Нажмите "Create personal access token"
- Скопируйте токен (он будет показан только один раз!)
Необходимые права:
- ✅ write_repository - для работы с репозиториями
Как это работает?¶
Приоритет credentials¶
При выполнении Git операций используется следующий порядок приоритета:
- Персональный токен пользователя (из CredentialsManager) - высший приоритет
- Глобальный токен (из
.envфайла) - fallback
Это позволяет: - Пользователям с персональными токенами использовать их автоматически - Пользователям без персональных токенов использовать глобальный токен (если настроен)
Автоматическое определение платформы¶
Система автоматически определяет платформу по URL репозитория:
github.com→ Использует GitHub credentialsgitlab.comили другой GitLab → Использует GitLab credentials
Инжектирование credentials в URL¶
При выполнении Git операций (pull, push), credentials автоматически добавляются в HTTPS URL:
Настройка для администратора¶
Глобальные credentials (fallback)¶
Администратор может настроить глобальные credentials в .env файле:
# GitHub credentials (fallback for users without personal tokens)
GITHUB_TOKEN=ghp_xxxxxxxxxxxxxxxxxxxx
GITHUB_USERNAME=admin_username
# GitLab credentials (fallback for users without personal tokens)
GITLAB_TOKEN=glpat-xxxxxxxxxxxxxxxxxxxx
GITLAB_USERNAME=admin_username
Местоположение файлов¶
- Ключ шифрования:
./data/.credentials_key - Зашифрованные credentials:
./data/user_credentials.enc
Важно: - Не удаляйте ключ шифрования, иначе все сохраненные токены станут нечитаемыми - Делайте резервные копии ключа шифрования - Установите правильные права доступа к файлам (600)
Troubleshooting¶
Ошибка: "Authentication failed"¶
Причины: 1. Токен не установлен или устарел 2. У токена недостаточно прав 3. Токен был отозван на платформе
Решение:
1. Выполните /listcredentials - проверьте наличие токена
2. Удалите старый токен: /removetoken
3. Создайте новый токен на платформе
4. Добавьте новый токен: /settoken
Ошибка: "Could not decrypt credentials"¶
Причина: Ключ шифрования был изменен или удален.
Решение:
1. Удалите все токены: /removetoken → Удалить все
2. Добавьте токены заново: /settoken
Сообщение с токеном не удалилось¶
Решение: 1. Удалите сообщение вручную 2. Если токен был скомпрометирован - отзовите его на платформе 3. Создайте новый токен
Примеры использования¶
Пример 1: Первоначальная настройка¶
1. Создайте токен на GitHub
2. Отправьте /settoken боту
3. Выберите GitHub
4. Введите username: john_doe
5. Введите token: ghp_xxxxxxxxxxxxxxxxxxxx
6. ✅ Токен сохранен!
Теперь все Git операции будут использовать ваш токен автоматически.
Пример 2: Работа с несколькими платформами¶
1. Добавьте GitHub токен:
/settoken → GitHub → username → token
2. Добавьте GitLab токен:
/settoken → GitLab → username → token
3. Проверьте:
/listcredentials
Бот автоматически выберет правильный токен в зависимости от платформы.
Пример 3: Обновление токена¶
1. Старый токен истек
2. Создайте новый токен на платформе
3. Отправьте /settoken
4. Выберите платформу (GitHub/GitLab)
5. Введите username и новый token
Новый токен заменит старый автоматически.
FAQ¶
Q: Можно ли использовать SSH вместо HTTPS?
A: Да, если ваш репозиторий использует SSH URL (git@github.com:...), токены не требуются. SSH ключи управляются стандартным образом через систему.
Q: Что произойдет если я потеряю ключ шифрования?
A: Все сохраненные токены станут нечитаемыми. Пользователям нужно будет добавить токены заново через /settoken.
Q: Безопасно ли передавать токен через Telegram?
A: Telegram использует шифрование для передачи сообщений. Дополнительно: - Сообщение с токеном автоматически удаляется после получения - Токен шифруется перед сохранением - Токен не логируется в системе
Q: Может ли администратор видеть мои токены?
A: Нет, токены хранятся в зашифрованном виде. Администратор может только удалить файл с зашифрованными токенами, но не прочитать их.
Q: Можно ли использовать один токен для нескольких репозиториев?
A: Да, один токен можно использовать для всех репозиториев на данной платформе (GitHub или GitLab).
Архитектура¶
Компоненты системы¶
┌─────────────────────────────────────────────────────────┐
│ Telegram Bot │
├─────────────────────────────────────────────────────────┤
│ │
│ ┌──────────────────┐ ┌────────────────────┐ │
│ │ Credentials │ │ Git Operations │ │
│ │ Handlers │◄──────►│ │ │
│ │ │ │ - pull/push │ │
│ └────────┬─────────┘ │ - commit │ │
│ │ └──────────┬─────────┘ │
│ │ │ │
│ ▼ ▼ │
│ ┌─────────────────────────────────────────────────┐ │
│ │ CredentialsManager │ │
│ │ │ │
│ │ ┌──────────────┐ ┌──────────────────┐ │ │
│ │ │ Encryption │◄──────►│ File Storage │ │ │
│ │ │ (Fernet) │ │ (Encrypted) │ │ │
│ │ └──────────────┘ └──────────────────┘ │ │
│ └─────────────────────────────────────────────────┘ │
│ │
└─────────────────────────────────────────────────────────┘
Поток данных¶
-
Установка токена:
-
Использование токена: