TEdgeBrowser(WebView2)で基本認証(ベーシック認証)に応答する
Delphi 12.1(Community Edition)でTEdgeBrowserを使って基本認証に応答します。
(1)はじめに
Windows10の場合はMicrosoft WebView2 ランタイムのインストールを以下のURLを参照してインストールしてください。
https://mam-mam.net/delphi/tedgebrowser.html
「WebView2Loader.dll」も、
https://mam-mam.net/delphi/tedgebrowser.html
を参照してください。
(2)プロジェクトの作成とフォームの設計
Delphi IDEを起動し、「ファイル」⇒「Windows VCLアプリケーション -Delphi」をクリックします
フォームに、TEdgeBrowser×1個、TButton×1個をドラッグ&ドロップします

(3)ソースコードの記述
IDEの「コード」で、以下ソースコードをコピー&ペーストします。
IDEの「デザイン」でオブジェクトインスペクタのイベントプロパティに、
Form1.OnCreate に FormCreate を設定
Form1.OnDestroyに FormDestryo を設定
Button1.OnClick に Button1Click を設定し、
EdgeBrowser1.OnCreateWebViewCompletedに EdgeBrowser1CreateWebViewCompleted を設定します。

unit Unit1; interface uses Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Winapi.WebView2, Winapi.ActiveX, Vcl.StdCtrls, Vcl.Edge; type TBasicAuthHandler = class(TInterfacedObject, ICoreWebView2BasicAuthenticationRequestedEventHandler) public function Invoke(const sender: ICoreWebView2; const args: ICoreWebView2BasicAuthenticationRequestedEventArgs): HResult; stdcall; end; TForm1 = class(TForm) EdgeBrowser1: TEdgeBrowser; Button1: TButton; procedure Button1Click(Sender: TObject); procedure EdgeBrowser1CreateWebViewCompleted(Sender: TCustomEdgeBrowser; AResult: HRESULT); procedure FormCreate(Sender: TObject); procedure FormDestroy(Sender: TObject); private { Private 宣言 } CacheDir:String; //ブラウザキャッシュのディレクトリ BasicAuthHandler:TBasicAuthHandler; ERToken:EventRegistrationToken; public { Public 宣言 } end; var Form1: TForm1; implementation {$R *.dfm} uses System.IOUtils; procedure TForm1.Button1Click(Sender: TObject); begin //基本認証で保護されたサイトを開く EdgeBrowser1.Navigate('https://mam-mam.net/sec/'); end; procedure TForm1.EdgeBrowser1CreateWebViewCompleted(Sender: TCustomEdgeBrowser; AResult: HRESULT); begin //ベーシック認証時にユーザーとパスワードを設定したい場合 BasicAuthHandler:=TBasicAuthHandler.Create; ICoreWebView2_10(EdgeBrowser1.DefaultInterface).add_BasicAuthenticationRequested( BasicAuthHandler, ERToken ); end; procedure TForm1.FormCreate(Sender: TObject); begin //ブラウザキャッシュの場所を指定する CacheDir:=ExtractFilePath(Application.ExeName)+'cache'; EdgeBrowser1.UserDataFolder:=CacheDir; //WebViewが(非同期で)作成されるまで待つ if not EdgeBrowser1.WebViewCreated then begin EdgeBrowser1.CreateWebView; while not EdgeBrowser1.WebViewCreated do begin Application.ProcessMessages; Sleep(100); end; end; end; procedure TForm1.FormDestroy(Sender: TObject); begin //必要な場合はアプリケーション終了時にブラウザキャッシュを削除 if DirectoryExists(CacheDir) then TDirectory.Delete(CacheDir, True); end; { TBasicAuthHandler } function TBasicAuthHandler.Invoke(const sender: ICoreWebView2; const args: ICoreWebView2BasicAuthenticationRequestedEventArgs): HResult; var res:ICoreWebView2BasicAuthenticationResponse; url:PChar; begin //ベーシック認証の要求があった場合 args.Get_uri(url); if url='https://mam-mam.net/sec/' then begin //ユーザーとパスワードを設定する args.Get_Response(res); res.Set_UserName('user'); res.Set_Password('pass'); end; Result := S_OK; end; end.
(4)「WebView2Loader.dll」ファイルを実行ファイルと同じフォルダ内にコピーする
「C:\Program Files (x86)\Embarcadero\Studio\23.0\Redist\win32\WebView2Loader.dll」
「C:\Program Files (x86)\Embarcadero\Studio\23.0\Redist\win64\WebView2Loader.dll」
ファイルを、実行ファイルと同じフォルダ内(プロジェクト保存フォルダ\Win32\Debug)にコピーします
(A)「Debug」ビルトで 「Windows 32ビット」 |
プロジェクト保存フォルダ\Win32\Debug |
(B)「Debug」ビルトで 「Windows 64ビット」 |
プロジェクト保存フォルダ\Win64\Debug |
(C)「Release」ビルトで 「Windows 32ビット」 |
プロジェクト保存フォルダ\Win32\Release |
(D)「Release」ビルトで 「Windows 64ビット」 |
プロジェクト保存フォルダ\Win64\Release |
(5)実行する
IDEから「実行」⇒「実行」をクリックしてコンパイル&実行します。
「Button1」をクリックすると、ベーシック認証を自動認証後にページが表示されます。
ちゃんとベーシック認証のヘッダーが追加されているのがわかります。

(参考)リクエスト時に基本認証ヘッダーを送り込んで認証する
上記の方法ではレスポンス時に基本認証を求められた場合にユーザーとパスワードを送っています。
以下の方法ではリクエスト時に基本認証ヘッダーを送り込んで認証します。
unit Unit1; interface uses Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Winapi.WebView2, Winapi.ActiveX, Vcl.StdCtrls, Vcl.Edge; type TForm1 = class(TForm) EdgeBrowser1: TEdgeBrowser; Button1: TButton; procedure Button1Click(Sender: TObject); procedure EdgeBrowser1CreateWebViewCompleted(Sender: TCustomEdgeBrowser; AResult: HRESULT); procedure EdgeBrowser1WebResourceRequested(Sender: TCustomEdgeBrowser; Args: TWebResourceRequestedEventArgs); procedure FormCreate(Sender: TObject); procedure FormDestroy(Sender: TObject); private { Private 宣言 } CacheDir:String; //ブラウザキャッシュのディレクトリ public { Public 宣言 } end; var Form1: TForm1; implementation {$R *.dfm} uses System.IOUtils, System.NetEncoding; procedure TForm1.Button1Click(Sender: TObject); begin EdgeBrowser1.Navigate('https://mam-mam.net/sec/'); end; procedure TForm1.EdgeBrowser1CreateWebViewCompleted(Sender: TCustomEdgeBrowser; AResult: HRESULT); begin //特定のURLをリクエスト時に //「EdgeBrowser1WebResourceRequested」メソッドを呼ぶようにフィルター設定する EdgeBrowser1.AddWebResourceRequestedFilter( 'https://mam-mam.net/sec/', // '*'を指定した場合は全てのURLを指定したことになる COREWEBVIEW2_WEB_RESOURCE_CONTEXT_ALL //全てのコンテキスト ); end; procedure TForm1.EdgeBrowser1WebResourceRequested(Sender: TCustomEdgeBrowser; Args: TWebResourceRequestedEventArgs); var Request: ICoreWebView2WebResourceRequest; Headers: ICoreWebView2HttpRequestHeaders; auth:string; user,password:string; begin //ヘッダーに基本認証を追加する Args.ArgsInterface.Get_Request(Request); Request.Get_Headers(Headers); user:='user'; //基本認証のユーザー名 password:='pass'; //基本認証のパスワード auth := 'Basic ' + TNetEncoding.Base64.Encode(user + ':' + password); Headers.SetHeader('Authorization', PChar(auth)); end; procedure TForm1.FormCreate(Sender: TObject); begin //ブラウザキャッシュの場所を指定する CacheDir:=ExtractFilePath(Application.ExeName)+'cache'; EdgeBrowser1.UserDataFolder:=CacheDir; //WebViewが(非同期で)作成されるまで待つ if not EdgeBrowser1.WebViewCreated then begin EdgeBrowser1.CreateWebView; while not EdgeBrowser1.WebViewCreated do begin Application.ProcessMessages; Sleep(100); end; end; end; procedure TForm1.FormDestroy(Sender: TObject); begin //必要な場合はアプリケーション終了時にブラウザキャッシュを削除 if DirectoryExists(CacheDir) then TDirectory.Delete(CacheDir, True); end; end.
