Delphi Mail OAuth2
Microsoft 365 と Gmail は、ほとんどのメールボックスで単純なパスワードをもう受け付けません。OAuth2 トークンを取得して更新し続け、SMTP、IMAP、POP3 のクライアントが必要とする SASL 文字列をそのまま渡せます。
Microsoft 365 と Gmail は、ほとんどのメールボックスで単純なパスワードをもう受け付けません。OAuth2 トークンを取得して更新し続け、SMTP、IMAP、POP3 のクライアントが必要とする SASL 文字列をそのまま渡せます。
Exchange Online と Gmail 向けの OAuth 2.0 アクセストークンを取得・更新し、XOAUTH2 と OAUTHBEARER の文字列を生成します。メールサーバーとは一切通信しないため、Indy の TIdSMTP、TIdIMAP4、TIdPOP3 や、生の SASL コマンドを送信できる任意のライブラリと組み合わせて使えます。
TsgcMailOAuth2(ユニット sgcAuth_Mail_OAuth2)
SASL OAUTHBEARER (RFC 7628) および XOAUTH2
Windows, macOS, Linux, iOS, Android
Enterprise および All-Access、加えて sgcAuth パックでも利用できます。sgcWebSockets .NET でも利用可能です。
Provider と Protocols を選び、ClientId を設定して、保存済みのリフレッシュトークンを再利用するか Start を呼び出し、GetXOAuth2 でメールセッションを認証します。
uses
IdSMTP, sgcAuth_Mail_OAuth2;
// Mail はフォームフィールドです:Mail: TsgcMailOAuth2;
procedure TForm1.FormCreate(Sender: TObject);
begin
Mail := TsgcMailOAuth2.Create(Self);
Mail.Provider := mopMicrosoft365;
Mail.Protocols := [mpSMTP];
Mail.TenantId := 'contoso.onmicrosoft.com';
Mail.ClientId := 'your-application-id';
Mail.OnTokensChanged := OnMailTokensChanged;
// 保存済みのリフレッシュトークンを再利用し、使えなくなった場合のみサインインします
Mail.RefreshToken := LoadRefreshToken;
if (Mail.RefreshToken = '') or not Mail.Refresh then
Mail.Start; // ブラウザを開き、PKCE とループバックリダイレクトで認証します
end;
procedure TForm1.OnMailTokensChanged(Sender: TObject; const AccessToken,
RefreshToken: String; const ExpiresAt: TDateTime);
begin
SaveRefreshToken(RefreshToken); // 保存先で暗号化してください
end;
// TIdSMTP は UseTLS = utUseExplicitTLS、AuthType = satNone とします
procedure TForm1.Authenticate(aSMTP: TIdSMTP);
begin
aSMTP.Connect; // EHLO と STARTTLS
aSMTP.SendCmd('AUTH XOAUTH2 ' + Mail.GetXOAuth2('user@contoso.com'), 235);
end;
// uses: IdSMTP, sgcAuth_Mail_OAuth2
TsgcMailOAuth2 *Mail = new TsgcMailOAuth2(this);
Mail->Provider = mopMicrosoft365;
Mail->Protocols = TsgcMailOAuth2Protocols() << mpSMTP;
Mail->TenantId = "contoso.onmicrosoft.com";
Mail->ClientId = "your-application-id";
Mail->OnTokensChanged = OnMailTokensChanged;
Mail->RefreshToken = LoadRefreshToken();
if (Mail->RefreshToken.IsEmpty() || !Mail->Refresh())
Mail->Start();
IdSMTP1->Connect();
IdSMTP1->SendCmd("AUTH XOAUTH2 " + Mail->GetXOAuth2("user@contoso.com"), 235);
現代のメールに必要な OAuth2 部分を、プロバイダーの詳細を設定済みの1つのコンポーネントにまとめています。
Provider で mopMicrosoft365 または mopGmail を選ぶと、正しいエンドポイントが設定されます。mopCustom では、他の任意のプロバイダー向けに CustomAuthURL、CustomTokenURL、CustomDeviceAuthorizationURL、CustomScope を指定できます。
Protocols に mpSMTP、mpIMAP、mpPOP3 を任意に組み合わせて設定すると、コンポーネントが対応するスコープを要求します。Microsoft 365 では offline_access も付与されます。要求内容は GetScope で確認できます。
Flow で mofAuthorizationCodePKCE(ブラウザとループバックリダイレクト、LocalServerOptions を参照)または、サービスやコンソール向けの mofDeviceCode を選択できます。後者では OnDeviceCode で表示すべきコードとURLを受け取ります。
AccessToken、RefreshToken、ExpiresAt は常に最新の状態です。Refresh はアクセストークンを同期的に更新し、OnTokensChanged が毎回発生するため、新しいリフレッシュトークンを永続化できます。
GetXOAuth2 と GetOAuthBearer は AUTH XOAUTH2 と AUTH OAUTHBEARER 用の Base64 初期応答を返します。Raw 系のバリアントと sgcGetXOAuth2 関数群は、デバッグや他のトークン発行元との併用に役立ちます。
このコンポーネントはメール接続を一切開きません。Indy の TIdSMTP、TIdIMAP4、TIdPOP3、あるいは生の SASL コマンドを送信できる任意のメールライブラリを使用でき、トークン要求の TLS は HTTPClientOptions で設定します。
このコンポーネントが実装する標準規格の公式ソースです。
コンポーネントリファレンスへの直接リンク、すぐに実行できるデモプロジェクトの入手、体験版のダウンロードができます。
| オンラインヘルプ — TsgcMailOAuth2 このコンポーネントのプロパティ、メソッド、イベントの完全なリファレンスに加え、Microsoft 365 と Gmail のアプリ登録手順を掲載しています。 | 開く | |
| デモプロジェクト — Demos\26.Authentication\06.Mail_OAuth2 ブラウザおよびデバイスコードによるサインイン、トークン更新、AUTH XOAUTH2 で送信するテストメールを収録しています。sgcWebSockets パッケージに同梱されています。以下から体験版をダウンロードできます。 | 開く | |
| 技術ドキュメント (PDF) このコンポーネントの機能、クイックスタート、Delphi および C++ Builder 向けのコードサンプル、一次資料のリファレンスを掲載しています。 | 開く | |
| ユーザーマニュアル (PDF) ライブラリのすべてのコンポーネントを網羅した総合マニュアルです。 | 開く | |
| ブログ — Delphi でパスキー、SAML SSO、LDAP、TOTP 2FA によるログインを実現する 6つの認証コンポーネントが1つの Delphi アプリケーションでどう連携するかを解説します。 | 開く |