🇬🇧 English
TL;DR — a web alternative to the classic Windows Steam Desktop Authenticator (SDA). Generates Steam Guard 2FA codes, confirms trades/market listings, and can add or remove the Steam Guard mobile authenticator — all from a local web UI, on Windows, Linux or macOS.
Keywords: Steam Guard · Steam Desktop Authenticator · SDA · maFile · mobile authenticator · 2FA · TOTP · Steam trade confirmations · shared_secret / identity_secret · self-hosted · Node.js.
- Live Steam Guard codes — correct Steam TOTP (HMAC-SHA1, 30-second window, Steam's base-26 alphabet) with a countdown ring; time is synced to Steam's own clock.
- Import
.maFile— drag & drop, file picker, or paste JSON (Ctrl+V). Encrypted SDA exports are supported too (PBKDF2-SHA1 + AES-256-CBC) — add the matchingmanifest.jsonto the same import and you'll be asked for the password. - Create a new authenticator — log in with username/password, enter the email Steam Guard
code, optionally attach a phone number (or stay phone-less with email confirmation). You get
the revocation code (R-code) at the end. The login & password are saved into the
.maFile. - Remove an authenticator — unlink Steam Guard Mobile using the revocation code.
- Trade & market confirmations — list pending confirmations and accept/decline them one by one or in bulk.
- Download the
.maFile— right-click an account (or the ⋮ menu) → Download .maFile. - Login & password at a glance — shown next to the code, masked by default, with reveal/copy.
- Search & scroll — filter accounts by name or SteamID; the list scrolls on its own when you have many of them.
- Per-account or global proxy — HTTP / SOCKS via
undici(COXER_PROXY/STEAM_PROXY). - Durable storage —
.maFiles live in./maFileswith collision-safe filenames, atomic writes, and BOM-tolerant parsing; deleting an account moves the file to./maFiles/.trashinstead of erasing it, so nothing is lost across restarts. - Polished UI — terminal-dark theme, animated background, fully responsive (desktop & mobile).
- One-command deploy — production
deploy.shfor Ubuntu (Node + nginx + systemd, optional HTTP Basic Auth / UFW / Let's Encrypt TLS).
npm install
npm startRequires Node.js ≥ 18.
All configuration is via environment variables:
| Variable | Default | Description |
|---|---|---|
PORT |
3000 |
HTTP port |
HOST |
127.0.0.1 |
Bind address (keep on localhost unless behind a proxy) |
COXER_VAULT_DIR |
./maFiles |
Where .maFiles are stored |
COXER_PROXY |
— | Global proxy for Steam requests (STEAM_PROXY also works) |
The browser never receives secrets in the account list — the server returns ready-made codes and
public fields only. The raw .maFile and credentials are served only on explicit request.
| Method & path | Purpose |
|---|---|
GET /api/accounts |
List accounts (public fields) |
POST /api/accounts/import |
Import one or more .maFiles |
DELETE /api/accounts/:id |
Remove account (file → .trash) |
PATCH /api/accounts/:id |
Set per-account proxy |
GET /api/accounts/:id/code |
Current Steam Guard code for one account |
GET /api/codes |
Codes for all accounts + time sync |
GET /api/accounts/:id/credentials |
Login & password (on demand) |
GET /api/accounts/:id/file |
Download the raw .maFile |
GET /api/accounts/:id/actions |
Pending trade/market confirmations |
POST /api/accounts/:id/actions/resolve |
Accept/decline confirmation(s) |
POST /api/accounts/:id/revoke |
Remove the authenticator (R-code) |
POST /api/enroll/start |
Begin creating a new authenticator |
GET /api/enroll/:id |
Enrollment state (polling) |
POST /api/enroll/:id/input |
Submit a step value (email/SMS code…) |
POST /api/enroll/:id/cancel |
Cancel enrollment |
Pure Node.js (ESM) + Express backend, undici for proxied Steam requests, and a dependency-free
vanilla-JS frontend. No database. Static assets are served straight from public/.
| File | Responsibility |
|---|---|
server.js |
Express app & REST API |
lib/guardcode.js |
Steam Guard code generation (buildCode) |
lib/clock.js |
Steam time sync (serverClock) |
lib/vault.js |
Parse .maFile (readVault) |
lib/blobcrypt.js |
Decrypt encrypted .maFile (PBKDF2 + AES-256-CBC) |
lib/registry.js |
Profile & .maFile storage |
lib/actions.js |
Trade/market confirmation hashing & operations |
lib/signin.js |
Mobile sign-in (RSA password + Begin/Poll) |
lib/enroll.js |
Add authenticator (HasPhone → Add → Finalize) |
lib/enrollflow.js |
Interactive enrollment state machine |
lib/revoke.js |
Remove authenticator by revocation code |
lib/tokenwire.js |
Refresh access token from refresh token |
lib/rpc.js |
Steam service message schemas & transport (invokeService) |
lib/wire.js |
Minimal protobuf codec (packMessage / unpackMessage) |
lib/netgate.js |
Proxy dispatcher (HTTP/SOCKS via undici) |
On a fresh Ubuntu server, just run:
curl -fsSL https://raw.githubusercontent.com/exfador/steam-desktop-authenticator-web/main/deploy.sh | sudo bashThe script bootstraps itself: it installs git, downloads the project into /opt/sda (creating
folders as needed) and runs the installer. Pass options as environment variables:
# domain + HTTPS (Let's Encrypt):
curl -fsSL https://raw.githubusercontent.com/exfador/steam-desktop-authenticator-web/main/deploy.sh \
| sudo DOMAIN=example.com SETUP_TLS=yes TLS_EMAIL=you@mail.com bashRe-running the same command later updates the code and redeploys — your .maFiles are untouched.
git clone https://github.com/exfador/steam-desktop-authenticator-web.git /opt/sda
cd /opt/sda && sudo bash deploy.shIt installs Node (NodeSource), sets up an nginx reverse proxy and a systemd service, and
(by default) puts HTTP Basic Auth in front of the site. Logs: journalctl -u coxerhub -f.
Useful env vars: INSTALL_DIR (default /opt/sda), BRANCH (default main), APP_PORT
(default 3000), SETUP_AUTH / AUTH_USER / AUTH_PASS, SETUP_UFW, COXER_PROXY, VAULT_DIR.
⚠️ Don't run the project from/root— the service user can't read it (the installer defaults to/opt/sdafor exactly this reason).
You can deploy the app on a VDS server and manage your accounts remotely from any device.
- Rent any Ubuntu VDS — you will receive a public IP address.
- Run the one-line install from the Deploy section above.
- After deployment the script prints the site URL, login, and Basic Auth password — save them.
- Open
http://<public-IP>in a browser from any device — the interface is accessible from the internet.
For extra security, attach a domain and enable HTTPS:
sudo DOMAIN=your.domain SETUP_TLS=yes TLS_EMAIL=you@mail.com bash deploy.sh
- A
.maFilecontainsshared_secretandidentity_secret— full access to Steam Guard. Treat it like a password. - By default the server listens on
127.0.0.1only. Do not expose it to the internet without HTTPS and authentication — the bundleddeploy.shadds HTTP Basic Auth for exactly this reason. - Files in
./maFilesare stored in plain text; keep the folder private (it's in.gitignore). - The account list never ships secrets to the browser; downloading a
.maFileor revealing the password are explicit, on-demand actions.
AGPL-3.0 — see LICENSE and NOTICE.
This is an independent project and is not affiliated with, endorsed by, or connected to Valve or Steam. "Steam" is a trademark of Valve Corporation.
🇷🇺 Русский
Коротко — веб-альтернатива классическому Windows-приложению Steam Desktop Authenticator (SDA). Генерирует коды Steam Guard, подтверждает трейды и заявки на маркете, умеет добавлять и удалять мобильный аутентификатор — всё через браузер, на Windows, Linux или macOS.
- Живые коды Steam Guard — правильный Steam TOTP (HMAC-SHA1, окно 30 секунд, алфавит Steam base-26) с кольцом обратного отсчёта; время синхронизируется с серверами Steam.
- Импорт
.maFile— перетащите файл, выберите через диалог или вставьте JSON (Ctrl+V). Поддерживаются зашифрованные экспорты SDA (PBKDF2-SHA1 + AES-256-CBC) — добавьтеmanifest.jsonк импорту и вам предложат ввести пароль. - Создание нового аутентификатора — войдите по логину/паролю, введите код из email, при желании
привяжите номер телефона. В конце вы получите код восстановления (R-code). Логин и пароль
сохраняются в
.maFile. - Удаление аутентификатора — отвязка Steam Guard Mobile по коду восстановления.
- Подтверждения трейдов и маркета — список активных подтверждений, принятие/отклонение поштучно или оптом.
- Скачать
.maFile— правой кнопкой по аккаунту (или меню ⋮) → Скачать .maFile. - Логин и пароль рядом — выводятся рядом с кодом, по умолчанию скрыты, можно раскрыть и скопировать.
- Поиск и прокрутка — фильтрация аккаунтов по имени или SteamID; список прокручивается автоматически при большом количестве аккаунтов.
- Прокси на аккаунт или глобальный — HTTP / SOCKS через
undici(COXER_PROXY/STEAM_PROXY). - Надёжное хранилище —
.maFile-ы лежат в./maFilesс безколлизионными именами, атомарными записями и BOM-устойчивым парсером; удаление аккаунта перемещает файл в./maFiles/.trash, ничего не теряется при перезапуске. - Стильный интерфейс — тёмная терминальная тема, анимированный фон, полностью адаптивный (ПК и мобильный).
- Деплой одной командой — скрипт
deploy.shдля Ubuntu (Node + nginx + systemd, опционально HTTP Basic Auth / UFW / Let's Encrypt TLS).
npm install
npm startОткройте http://127.0.0.1:3000
Требуется Node.js ≥ 18.
Все настройки — через переменные окружения:
| Переменная | По умолчанию | Описание |
|---|---|---|
PORT |
3000 |
HTTP-порт |
HOST |
127.0.0.1 |
Адрес прослушивания (оставьте localhost, если за прокси) |
COXER_VAULT_DIR |
./maFiles |
Папка для хранения .maFile |
COXER_PROXY |
— | Глобальный прокси для запросов к Steam (или STEAM_PROXY) |
Браузер никогда не получает секреты в списке аккаунтов — сервер возвращает только готовые коды
и публичные поля. Сырой .maFile и учётные данные отдаются только по явному запросу.
| Метод и путь | Назначение |
|---|---|
GET /api/accounts |
Список аккаунтов (публичные поля) |
POST /api/accounts/import |
Импорт одного или нескольких .maFile |
DELETE /api/accounts/:id |
Удалить аккаунт (файл → .trash) |
PATCH /api/accounts/:id |
Задать прокси для аккаунта |
GET /api/accounts/:id/code |
Текущий код Steam Guard для одного аккаунта |
GET /api/codes |
Коды всех аккаунтов + синхронизация времени |
GET /api/accounts/:id/credentials |
Логин и пароль (по запросу) |
GET /api/accounts/:id/file |
Скачать сырой .maFile |
GET /api/accounts/:id/actions |
Активные подтверждения трейдов/маркета |
POST /api/accounts/:id/actions/resolve |
Принять/отклонить подтверждения |
POST /api/accounts/:id/revoke |
Удалить аутентификатор (R-code) |
POST /api/enroll/start |
Начать создание нового аутентификатора |
GET /api/enroll/:id |
Состояние процесса создания (polling) |
POST /api/enroll/:id/input |
Передать значение шага (код из email/SMS…) |
POST /api/enroll/:id/cancel |
Отменить создание аутентификатора |
Бэкенд — чистый Node.js (ESM) + Express, undici для проксированных запросов к Steam,
фронтенд — vanilla JS без зависимостей. Без базы данных. Статика раздаётся прямо из public/.
| Файл | Ответственность |
|---|---|
server.js |
Express-приложение и REST API |
lib/guardcode.js |
Генерация кода Steam Guard (buildCode) |
lib/clock.js |
Синхронизация времени Steam (serverClock) |
lib/vault.js |
Парсинг .maFile (readVault) |
lib/blobcrypt.js |
Расшифровка зашифрованного .maFile (PBKDF2 + AES-256-CBC) |
lib/registry.js |
Хранение профилей и .maFile |
lib/actions.js |
Хэширование и операции подтверждений трейдов/маркета |
lib/signin.js |
Мобильный вход (RSA-пароль + Begin/Poll) |
lib/enroll.js |
Добавление аутентификатора (HasPhone → Add → Finalize) |
lib/enrollflow.js |
Конечный автомат процесса создания аутентификатора |
lib/revoke.js |
Удаление аутентификатора по коду восстановления |
lib/tokenwire.js |
Обновление access-токена из refresh-токена |
lib/rpc.js |
Схемы сообщений Steam и транспорт (invokeService) |
lib/wire.js |
Минимальный protobuf-кодек (packMessage / unpackMessage) |
lib/netgate.js |
Диспетчер прокси (HTTP/SOCKS через undici) |
На чистом Ubuntu-сервере выполните:
curl -fsSL https://raw.githubusercontent.com/exfador/steam-desktop-authenticator-web/main/deploy.sh | sudo bashСкрипт сам себя бутстрапит: устанавливает git, скачивает проект в /opt/sda и запускает
установку. Параметры передаются через переменные окружения:
# домен + HTTPS (Let's Encrypt):
curl -fsSL https://raw.githubusercontent.com/exfador/steam-desktop-authenticator-web/main/deploy.sh \
| sudo DOMAIN=example.com SETUP_TLS=yes TLS_EMAIL=you@mail.com bashПовторный запуск той же команды обновляет код и переразворачивает сервис — .maFile-ы не трогаются.
git clone https://github.com/exfador/steam-desktop-authenticator-web.git /opt/sda
cd /opt/sda && sudo bash deploy.shСкрипт устанавливает Node (NodeSource), настраивает nginx как reverse proxy и systemd-сервис,
по умолчанию включает HTTP Basic Auth. Логи: journalctl -u coxerhub -f.
Полезные переменные: INSTALL_DIR (по умолч. /opt/sda), BRANCH (по умолч. main),
APP_PORT (по умолч. 3000), SETUP_AUTH / AUTH_USER / AUTH_PASS, SETUP_UFW,
COXER_PROXY, VAULT_DIR.
⚠️ Не запускайте проект из/root— сервисный пользователь не сможет его прочитать (установщик по умолчанию использует/opt/sdaименно по этой причине).
Приложение можно поднять на VDS-сервере и управлять аккаунтами удалённо — с любого устройства и из любой точки мира.
- Арендуйте любой VDS с Ubuntu — провайдер выдаст вам публичный IP-адрес.
- Выполните установку одной командой из раздела «Деплой» выше.
- После завершения скрипт выведет адрес сайта, логин и пароль Basic Auth — сохраните их.
- Откройте
http://<публичный-IP>в браузере с любого устройства — интерфейс доступен из интернета.
Для защиты трафика рекомендуется привязать домен и включить HTTPS:
sudo DOMAIN=ваш.домен SETUP_TLS=yes TLS_EMAIL=вы@почта bash deploy.sh
.maFileсодержитshared_secretиidentity_secret— полный доступ к Steam Guard. Обращайтесь с ним как с паролем.- По умолчанию сервер слушает только
127.0.0.1. Не открывайте его в интернет без HTTPS и аутентификации — именно для этогоdeploy.shдобавляет HTTP Basic Auth. - Файлы в
./maFilesхранятся в открытом виде; держите папку закрытой (она в.gitignore). - Список аккаунтов никогда не отдаёт секреты в браузер; скачать
.maFileили показать пароль — это явные действия по запросу пользователя.
AGPL-3.0 — см. LICENSE и NOTICE.
Независимый проект, не аффилированный с Valve или Steam. «Steam» — торговая марка Valve Corporation.
