Panel klienta WaveHost
Клиентская панель хостинг-провайдера: заказ и управление VPS и выделенными серверами, кошелек, счета и реферальная программа. Современный стек с безопасной аутентификацией и подключением к игровой панели через безопасный handshake. Клиент ведет все обслуживание из одного места.
Клиентская панель хостинг-провайдера: заказ и управление VPS и выделенными серверами, кошелёк, счета и реферальная программа. Самая интересная часть - безопасная связка с отдельной игровой панелью, чтобы клиент не входил дважды, а аккаунты соединялись без риска привязать чужой - через подписанное HMAC-рукопожатие.
Введение
WaveHost - хостинг-провайдер, которому нужно было одно место для его клиентов: заказываете сервер, платите, рекомендуете дальше, всё из одной панели. Сама эта часть - ремесленная работа, которую мы делали и раньше. Настоящий вызов лежал рядом: у провайдера уже работала отдельная игровая панель со своими аккаунтами, и эти два мира нужно было связать так, чтобы клиент почувствовал одну систему, а не две.
Проще всего было бы заставить людей входить дважды и вручную привязывать аккаунт по почте. Но это прямой путь к ошибкам, а при привязке аккаунтов у ошибки есть конкретная цена: привяжете кому-то чужой аккаунт - и получите проблему, которую обычным извинением не отменить. Мы хотели связку, которой можно доверять. Это исследование в основном об этой связке.
Всё из одного места
Фундамент панели - обслуживание, к которому клиент возвращается ежедневно. Заказ и управление серверами охватывают как VPS, так и выделенные машины, с их состоянием и конфигурацией, видимыми в одном представлении. Клиент не прыгает между инструментами, чтобы проверить, что у него есть и в каком оно состоянии.
Вокруг этого живёт остальное обслуживание. Кошелёк и счета стоят рядом, так что баланс, платежи и документы образуют одно целое, а не три отдельные вкладки, которые надо самому сводить. Реферальная программа добавляет реферальную ссылку и понятный поток комиссий, встроенный в тот же кошелёк. Всё это стоит на современном стеке с безопасной аутентификацией, потому что это панель, в которой лежат деньги и доступ к серверам.
Один вход вместо двух
Суть проекта - связать клиентскую панель с существующей игровой панелью. С точки зрения клиента проблема одновременно банальна и раздражает: два аккаунта, два входа, два мира, которые его не волнуют, потому что он просто хочет управлять всем в одном месте. С точки зрения инженера это как раз та часть, в которой легко сделать что-то опасное.
Наивное решение звучит так: пусть клиент укажет свой логин из игровой панели, а мы его привяжем. Проблема в том, что так каждый мог бы указать чужой логин и привязаться к аккаунту, который ему не принадлежит. Ручная привязка по почте медленна и так же дырява. Нам нужен был способ, при котором одна система доказывает другой личность клиента, не доверяя ничему, что проходит через браузер.
Подписанное рукопожатие
Решение - рукопожатие на основе HMAC. Когда клиент нажимает "связать аккаунт" в панели WaveHost, панель генерирует ссылку, несущую идентификатор пользователя, метку времени и подпись, посчитанную секретом, который знают только обе панели. Игровая панель принимает эту ссылку, пересчитывает подпись своим секретом и сравнивает. Если совпадает, она знает, что запрос действительно вышел из панели WaveHost, а не от того, кто подделал адрес.
Ключевое - то, чего браузер никогда не видит. Секрет не покидает серверы, поэтому даже тот, кто подсмотрит или перехватит ссылку, не посчитает верную подпись для чужого идентификатора. Метка времени закрывает вторую дыру: ссылка короткоживущая, а просроченный токен игровая панель просто отклоняет, так что подслушанную ссылку нельзя использовать позже.
Ссылка, соединяющая аккаунты, несёт подпись HMAC и метку времени. Игровая панель отклоняет токен, который просрочен или имеет неверную подпись, так что перехваченная или поддельная ссылка не привяжет чужой аккаунт. Секрет знает только одна и другая сторона, никогда браузер, поэтому удобство нельзя обменять на дыру.
Почему поддельная ссылка не сработает
Стоит разложить это на сценарии, потому что только тогда видно, что удобство действительно не стоит безопасности. Кто-то подменяет идентификатор в ссылке на чужой, чтобы привязаться к не своему аккаунту. Подпись перестаёт подходить, потому что её посчитали для другого идентификатора, а новую без секрета не сгенерировать. Игровая панель отклоняет запрос.
Второй сценарий: кто-то перехватывает верную ссылку одного клиента и пытается ею воспользоваться. Тут выручает метка времени. Ссылка живёт недолго, поэтому перехваченная позже она уже бесполезна, а просроченный токен игровая панель трактует ровно так же, как поддельный. В обоих случаях граница проверяется на стороне сервера, на входе, а не в интерфейсе, который всегда можно обойти.
До и после связки панелей
| Аспект | Отдельные панели | После связки через HMAC |
|---|---|---|
| Входы | два | один |
| Привязка аккаунта | вручную по почте | один клик |
| Риск привязать чужой | реальный | отклонён подписью |
| Секрет в браузере | - | никогда |
Каков итоговый результат
Клиент ведёт всё обслуживание из одного места. Заказывает серверы, управляет VPS и выделенными машинами, платит, рекомендует дальше и следит за кошельком, не прыгая между инструментами. Связка с игровой панелью работает в один клик, а не через обмен письмами, так что две системы провайдера ощущаются для клиента как одна.
Под этим удобство не оплачено безопасностью, потому что рукопожатие короткоживущее и подписанное, а секрет никогда не попадает в браузер. Поддельная или перехваченная ссылка не привяжет чужой аккаунт, потому что границу стережёт сервер на входе, а не интерфейс. Это ровно тот тип решения, ради которого был проект: просто для клиента, твёрдо там, где должно быть твёрдо.
Больше проектов
Другие работы из той же категории - посмотрите, как мы решаем похожие задачи.
Есть похожий проект?
Напишите нам - смета бесплатна и приходит в течение часа.




