Document desktop clients and align passkey client ID
Windows desktop build / publish (push) Canceled after 0s
Windows desktop build / publish (push) Canceled after 0s
This commit is contained in:
@@ -54,7 +54,7 @@ final class MainWindowController: NSWindowController, NSWindowDelegate, WKNaviga
|
|||||||
private var authSession: ASWebAuthenticationSession?
|
private var authSession: ASWebAuthenticationSession?
|
||||||
private var authAttemptID: UUID?
|
private var authAttemptID: UUID?
|
||||||
|
|
||||||
private static let authClientID = "shd-macos"
|
private static let authClientID = "shd-desktop"
|
||||||
private static let authCallbackScheme = "shd-auth"
|
private static let authCallbackScheme = "shd-auth"
|
||||||
private static let authCallbackURI = "shd-auth://callback"
|
private static let authCallbackURI = "shd-auth://callback"
|
||||||
|
|
||||||
|
|||||||
@@ -1,27 +1,42 @@
|
|||||||
# SHD Desktop
|
# SHD Desktop
|
||||||
|
|
||||||
Исходники настольного приложения SHD для Apple и Windows.
|
Исходный код настольных приложений SHD для macOS и Windows. Оба приложения открывают веб-версию SHD в отдельном окне и поддерживают работу с DEV и PROD.
|
||||||
|
|
||||||
## Папки
|
## Возможности и ограничения
|
||||||
|
|
||||||
- `Apple/` — приложение macOS на Swift и WKWebView.
|
- **macOS:** Swift, AppKit и WKWebView; вкладки и окна, печать, масштабирование, камера и микрофон. Сборка рассчитана на Apple Silicon и macOS 14 или новее.
|
||||||
- `Windows/` — приложение Windows на WPF и WebView2, установочные сценарии и инструкция.
|
- **Windows:** WPF и WebView2; окна и вкладки, загрузки, печать, масштабирование, системные диалоги сайта, камера и микрофон. Сборка рассчитана на Windows x64.
|
||||||
|
- **Passkey:** на странице входа приложение использует ту же кнопку passkey, что и сайт, и открывает вход в браузерной сессии. После входа ответ возвращается в приложение по `shd-auth://callback`.
|
||||||
|
- **Ограничение входа:** серверный поток настольной авторизации подключён только на DEV. В PROD вход по passkey в приложении пока не работает.
|
||||||
|
|
||||||
## Вход в macOS-приложении
|
## Сборка macOS
|
||||||
|
|
||||||
Клик по существующей кнопке passkey на странице входа в WKWebView перехватывается приложением и открывает тот же DEV-сайт в системном браузере. После входа callback возвращает код в приложение, а WKWebView отправляет его серверу и получает веб-сессию. Вход в приложении пока включён только для DEV, где серверный поток уже развёрнут.
|
Нужен Mac с Xcode Command Line Tools и Swift 6. Из корня репозитория выполните:
|
||||||
|
|
||||||
Серверный поток развёрнут на DEV. Клиент использует такой контракт:
|
```sh
|
||||||
|
./Apple/Scripts/build-app.sh
|
||||||
|
```
|
||||||
|
|
||||||
1. `GET /desktop-auth/authorize` с параметрами `client_id=shd-macos`, `redirect_uri=shd-auth://callback`, `response_type=code`, `state`, `code_challenge` и `code_challenge_method=S256`. После обычного входа, включая passkey, сервер возвращает браузер на `shd-auth://callback?code=…&state=…`.
|
Скрипт создаёт `Apple/dist/SHD-macOS-arm64.zip`. Внутри будет `SHD.app`; распакуйте архив и перенесите приложение в `/Applications`. Архив подписан локальной ad-hoc подписью и не нотарифицирован Apple.
|
||||||
2. `POST /desktop-auth/complete` с полями `code` и `code_verifier`. Сервер проверяет одноразовый код и PKCE, создаёт веб-сессию, устанавливает защищённую cookie и перенаправляет WKWebView на SHD.
|
|
||||||
|
|
||||||
Код должен быть одноразовым, связанным с PKCE и действовать не более 60 секунд. Callback URI фиксирован в приложении. Маршрут завершения должен принимать только такой код и verifier; исключение CSRF-защиты допустимо только для этого маршрута при обязательной проверке кода и PKCE.
|
## Сборка Windows
|
||||||
|
|
||||||
## Windows-приложение
|
Для сборки нужны Windows x64 и .NET 10 SDK. В PowerShell из корня репозитория выполните:
|
||||||
|
|
||||||
Windows-клиент находится в `Windows/`. Он открывает сайт в WebView2 и запускает passkey-вход по той же кнопке на странице, что и macOS-версия. Сборка создаётся GitHub Actions workflow **Windows desktop build**; инструкция по установке и получению архива находится в [`Windows/README.md`](Windows/README.md).
|
```powershell
|
||||||
|
./Windows/Scripts/build.ps1
|
||||||
|
```
|
||||||
|
|
||||||
## Сборка macOS-приложения
|
Скрипт создаёт `Windows/dist/SHD-Windows-x64.zip`, включающий приложение и сценарии установки. На компьютере пользователя .NET устанавливать не нужно; требуется Microsoft Edge WebView2 Runtime. Подробности установки и удаления описаны в [`Windows/README.md`](Windows/README.md).
|
||||||
|
|
||||||
Из каталога `Apple/` запустить `./Scripts/build-app.sh`. Сборка создаёт проверенный архив `Apple/dist/SHD-macOS-arm64.zip` и не устанавливает приложение в `/Applications`.
|
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.
|
||||||
|
|||||||
+3
-1
@@ -4,7 +4,7 @@ Windows-клиент — отдельное WPF-приложение на .NET 1
|
|||||||
|
|
||||||
## Установка
|
## Установка
|
||||||
|
|
||||||
1. Скачайте `SHD-Windows-x64.zip` из артефактов последней сборки **Windows desktop build** в GitHub Actions и распакуйте архив.
|
1. Скачайте `SHD-Windows-x64.zip` из артефактов успешной сборки **Windows desktop build** в GitHub Actions и распакуйте архив. Если успешной сборки ещё нет, соберите ZIP по инструкции ниже.
|
||||||
2. Откройте PowerShell в распакованной папке и выполните `powershell -ExecutionPolicy Bypass -File .\install.ps1`. Скрипт установит приложение в `%LOCALAPPDATA%\Programs\SHD`, добавит ярлык в меню «Пуск» и зарегистрирует адрес возврата `shd-auth://callback`.
|
2. Откройте PowerShell в распакованной папке и выполните `powershell -ExecutionPolicy Bypass -File .\install.ps1`. Скрипт установит приложение в `%LOCALAPPDATA%\Programs\SHD`, добавит ярлык в меню «Пуск» и зарегистрирует адрес возврата `shd-auth://callback`.
|
||||||
3. Запустите SHD из меню «Пуск».
|
3. Запустите SHD из меню «Пуск».
|
||||||
|
|
||||||
@@ -18,6 +18,8 @@ Windows-клиент — отдельное WPF-приложение на .NET 1
|
|||||||
|
|
||||||
Этот серверный поток сейчас подключён только на DEV. На PROD приложение сообщает об этом и не начинает отдельную авторизацию.
|
Этот серверный поток сейчас подключён только на DEV. На PROD приложение сообщает об этом и не начинает отдельную авторизацию.
|
||||||
|
|
||||||
|
Для DEV сервер ожидает `client_id=shd-desktop`, callback URI — `shd-auth://callback`. Оба значения должны совпадать с настройками приложения и сервера.
|
||||||
|
|
||||||
## Сборка
|
## Сборка
|
||||||
|
|
||||||
На Windows с установленным .NET 10 SDK запустите из PowerShell:
|
На Windows с установленным .NET 10 SDK запустите из PowerShell:
|
||||||
|
|||||||
Reference in New Issue
Block a user