トップへ(mam-mam.net/)

TEdgeBrowser(WebView2)で基本認証(ベーシック認証)に応答する ~Delphiソースコード集

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.