47 lines
2.7 KiB
Markdown
47 lines
2.7 KiB
Markdown
# MicrosoftLoginDialog.qml
|
||
|
||
Окно входа в аккаунт Microsoft. Работает так же, как официальный лаунчер: страница входа
|
||
открывается внутри приложения в `WebEngineView`, а лаунчер ждёт, когда браузер перейдёт на
|
||
`redirect_uri` с кодом в адресе.
|
||
|
||
Файл попадает в QML-модуль, только если CMake нашёл `Qt6::WebEngineQuick`. Поэтому
|
||
[Main](Main.md) не объявляет окно в разметке, а создаёт его через `Qt.createComponent()` при первом
|
||
входе (`openMicrosoftLogin()`).
|
||
|
||
## Интерфейс
|
||
|
||
| | |
|
||
|---|---|
|
||
| `backend` (required) | `LauncherBackend` |
|
||
| `openAt(url)` | открыть страницу входа |
|
||
| `failed(message)` | вход не удался. Окно ничего не знает о плашке сообщений главного окна и сообщает о неудаче сигналом |
|
||
|
||
## Как работает
|
||
|
||
На каждое `urlChanged` вызывается `handleUrl()`. Он передаёт адрес в
|
||
`backend.inspectMicrosoftRedirect()`. Разбор сделан в C++, чтобы правила совпадали с тем, как
|
||
[MsaAuthService](../cpp/MsaAuthService.md) строит `redirect_uri`.
|
||
|
||
Когда адрес совпал:
|
||
|
||
- окно закрывается, `codeTaken` выставляется в `true`;
|
||
- если есть код, вызывается `backend.finishMicrosoftLogin(code)`;
|
||
- если кода нет, вызывается `backend.cancelMicrosoftLogin()` и испускается `failed` с текстом от
|
||
Microsoft или общим «вход не завершён».
|
||
|
||
`codeTaken` нужен потому, что `WebEngineView` может сообщить об одном и том же адресе несколько
|
||
раз, а отдавать код дважды нельзя.
|
||
|
||
Кнопка «Отмена» выставляет `codeTaken`, закрывает окно и вызывает `cancelMicrosoftLogin()`. Щелчок
|
||
мимо окна и Esc его не закрывают.
|
||
|
||
## Куки
|
||
|
||
Профиль браузера создаётся через `WebEngineProfilePrototype` без `storageName`, то есть только в
|
||
памяти. Куки живут, пока работает лаунчер, и в общий браузер не попадают. Выбрать другой аккаунт
|
||
в пределах одного запуска позволяет `prompt=select_account` в адресе входа.
|
||
|
||
---
|
||
|
||
При создании этого документа использовался ИИ.
|