43 lines
3.8 KiB
Markdown
43 lines
3.8 KiB
Markdown
# SHD Desktop
|
||
|
||
Исходный код настольных приложений SHD для macOS и Windows. Оба приложения открывают веб-версию SHD в отдельном окне и поддерживают работу с DEV и PROD.
|
||
|
||
## Возможности и ограничения
|
||
|
||
- **macOS:** Swift, AppKit и WKWebView; вкладки и окна, печать, масштабирование, камера и микрофон. Сборка рассчитана на Apple Silicon и macOS 14 или новее.
|
||
- **Windows:** WPF и WebView2; окна и вкладки, загрузки, печать, масштабирование, системные диалоги сайта, камера и микрофон. Сборка рассчитана на Windows x64.
|
||
- **Passkey:** на странице входа приложение использует ту же кнопку passkey, что и сайт, и открывает вход в браузерной сессии. После входа ответ возвращается в приложение по `shd-auth://callback`.
|
||
- **Ограничение входа:** серверный поток настольной авторизации подключён только на DEV. В PROD вход по passkey в приложении пока не работает.
|
||
|
||
## Сборка macOS
|
||
|
||
Нужен Mac с Xcode Command Line Tools и Swift 6. Из корня репозитория выполните:
|
||
|
||
```sh
|
||
./Apple/Scripts/build-app.sh
|
||
```
|
||
|
||
Скрипт создаёт `Apple/dist/SHD-macOS-arm64.zip`. Внутри будет `SHD.app`; распакуйте архив и перенесите приложение в `/Applications`. Архив подписан локальной ad-hoc подписью и не нотарифицирован Apple.
|
||
|
||
## Сборка Windows
|
||
|
||
Для сборки нужны Windows x64 и .NET 10 SDK. В PowerShell из корня репозитория выполните:
|
||
|
||
```powershell
|
||
./Windows/Scripts/build.ps1
|
||
```
|
||
|
||
Скрипт создаёт `Windows/dist/SHD-Windows-x64.zip`, включающий приложение и сценарии установки. На компьютере пользователя .NET устанавливать не нужно; требуется Microsoft Edge WebView2 Runtime. Подробности установки и удаления описаны в [`Windows/README.md`](Windows/README.md).
|
||
|
||
GitHub Actions запускает Windows-сборку при изменениях в `Windows/` и вручную через workflow **Windows desktop build**. ZIP появляется в артефактах только после успешной сборки.
|
||
|
||
## Вход по passkey
|
||
|
||
Нажатие существующей кнопки passkey на сайте запускает поток настольной авторизации:
|
||
|
||
1. Приложение открывает `/desktop-auth/authorize` в браузере с `client_id=shd-desktop`, `redirect_uri=shd-auth://callback`, случайными `state` и PKCE challenge (S256).
|
||
2. После обычного входа сервер возвращает одноразовый код и `state` приложению через `shd-auth://callback`.
|
||
3. Приложение отправляет код и PKCE verifier в теле POST-запроса на `/desktop-auth/complete` из своего WebView. Сервер создаёт обычную веб-сессию, поэтому cookie остаётся в профиле приложения.
|
||
|
||
Код одноразовый и ограничен по времени. В приложениях нельзя включить PROD-вход одной настройкой: сервер должен отдельно разрешить и развернуть поток на PROD.
|