При реализации входа через OAuth 2.0 в приложениях на Pascal, таких как Delphi, важно уметь корректно обрабатывать события, связанные с перенаправлением в браузере. В рамках данной статьи мы рассмотрим, как можно отследить перенаправление на стороне сервера внутри компонента TWebBrowser, что позволит обработать данные из URL и избежать локальной навигации.
Проблема
Пользователь столкнулся с проблемой при реализации входа через OAuth 2.0: сервер осуществляет перенаправление на URL, содержащий необходимые данные (http://localhost/?code=abcdef), но событие TWebBrowser.BeforeNavigate2 в этом случае не срабатывает. Это затрудняет возможность самостоятельной обработки перенаправления и анализа данных URL.
Решение
В стандартной конфигурации TWebBrowser не предусмотрено срабатывание события для перенаправления. Вместо этого, событие OnBeforeNavigate2 активируется для начального URL перед перенаправлением, а затем OnNavigateComplete - после завершения перенаправления. Для определения факта перенаправления можно сравнить URL, предоставляемые этими событиями.
Однако, если включить флаг DOCHOSTUIFLAG_ENABLE_REDIRECT_NOTIFICATION в браузере, то событие OnBeforeNavigate2 начнет срабатывать и при перенаправлении, позволяя отменить его при необходимости.
Для включения этого флага необходимо реализовать интерфейс IDocHostUIHandler и его метод GetHostInfo(). Если используется версия Delphi 10.0 Seattle или новее, TWebBrowser уже реализует IDocHostUIHandler, и достаточно унаследовать его и переопределить метод GetHostInfo() по необходимости.
Для более старых версий Delphi можно создать отдельный класс, реализующий IDocHostUIHandler, и затем запросить у браузера интерфейс ICustomDoc, чтобы вызвать метод SetUIHandler().
Пример кода
type
TCustomWebBrowser = class(TWebBrowser, IDocHostUIHandler)
private
function GetHostInfo: HRESULT; override;
end;
implementation
function TCustomWebBrowser.GetHostInfo: HRESULT;
begin
Result := S_OK;
// Здесь может быть дополнительная логика
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
with TCustomWebBrowser.Create(nil) do
try
// Настройка компонента
Parent := Form1;
Align := alClient;
// Включение необходимых событий
OnBeforeNavigate := OnBeforeNavigateBrowser;
finally
Free;
end;
end;
procedure TForm1.OnBeforeNavigateBrowser(Sender: TObject; var SB: TWebBrowserBeforeNavigate2;
var Cancel: Boolean);
begin
if SB.Type = NAVIGATE_TYPE_Frame then
begin
// Обработка перенаправления
Cancel := True; // Отмена перенаправления
// Здесь можно обработать данные из URL
end;
end;
Заключение
В данной статье мы рассмотрели, как можно использовать расширенные возможности TWebBrowser для обработки перенаправлений на стороне сервера, что особенно важно при реализации входа через OAuth в приложениях на Pascal. Приведенный пример кода демонстрирует, как включить уведомления о перенаправлении и обработать их без локальной навигации.
При использовании TWebBrowser для входа через OAuth 2.0 в приложениях на Pascal, необходимо корректно обрабатывать перенаправления, чтобы избежать локальной навигации и анализировать данные из URL.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.