Files
BiLauncher/doc/qml/MicrosoftLoginDialog.md
T
2026-10-11 22:32:13 +03:00

47 lines
2.7 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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` в адресе входа.
---
При создании этого документа использовался ИИ.