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.
