Oauth2認証フロー名称 | 認可コードフロー | クライアントクレデンシャルフロー |
---|---|---|
マイクロソフト社実装名称 | 認証コードフロー | クライアント資格情報付与フロー |
BASP21 Pro OAuth2認証リンク | basp21poauth2-365.html | 本ページ |
認証コードフローとクライアント資格情報付与フローの違いを説明します。
項目 | 認証コードフロー | クライアント資格情報付与フロー |
---|---|---|
アクセス許可の種類 参考: アクセス許可の種類(マイクロソフト社) | 委任されたアクセス許可。 ユーザがアクセスできるメールボックスのみアクセス可能。 ユーザの同意画面でサインインが必要 | 管理者の同意が必要。 サービスプリンシパルでメールボックスのアクセス許可付与必要 |
アクセス許可APIの種類 | Microsoft Graph(3) Smtp.Send,offline_access,POP.AccessAsUserAll | Office 365 Excange Online(2) POP.AccessAsApp,SMTP.SendAsApp |
アクセス対象メールアドレス設定方法 | リフレッシュトークン取得時の同意画面でサインインしたメールアドレス | 管理者によるEntraアプリケーションのサービス プリンシパル登録 Add-MailboxPermissionコマンド、Add-RecipientPermissionコマンドで アクセス対象メールボックスへのアクセス許可 |
アクセストークン取得方法 | リフレッシュトークン使用 | クライアントID、クライアントシークレット使用 |
リフレッシュトークンの更新 | 90日毎に取得更新が必要。basp21p.iniに設定 | 不要 |
クライアントシークレット削除、有効期限切れ対応 | basp21p.iniに新クライアントシークレット設定必要 | basp21p.iniに新クライアントシークレット設定必要 |
アクセス対象メールアドレス追加方法 | リフレッシュトークン取得時の同意画面で対象メールアドレスでサインオン リフレッシュトークン取得して、basp21p.iniに新たなエントリ追加が必要。 |
サービスプリンシパルにメールアドレス許可追加 Add-MailboxPermissionコマンド、Add-RecipientPermissionコマンド basp21p.iniは、リフレッシュトークンなしのため変更不要 | メリット | 対象メールアドレス追加は、ユーザに委任のため、管理者許可が不要。 リフレッシュトークン取得時にメールアカウントでサインイン |
basp21p.iniは、リフレッシュトークンなしのため変更不要 | デメリット | 90日毎にリフレッシュトークン取得処理&basp21p.iniファイル設定が必要 | 対象メールアドレス追加時に管理者のメールアクセス許可操作が必要 |
basp21p.iniパラメータ | 名前 | 説明 |
---|---|---|
client_id | クライアントID | クライアントID |
client_secret | クライアントシークレット | クライアントシークレット |
token_uri | アクセストークン取得URL | OAuth 2.0 トークン エンドポイント (v2) https://login.microsoftonline.com/(テナントID)/oauth2/v2.0/token |
server | office365 SMTPサーバー | TLS Smtp.office365.com:587 |
popserver | office365 POPサーバー | Outlook.office365.com:995 |
oauth2_opt | token=nocache | オプション。アクセストークンをキャッシュせずに、毎回取得する |
bobj.Env="office365-NEW" bobj.Env="office365-OLD" -------------- basp21p.ini ------------- [office365-NEW] server=TLS Smtp.office365.com:587 popserver=Outlook.office365.com:995 client_id=xxxxx client_secret=xxxx token_uri=https://login.microsoftonline.com/xxxxx/oauth2/v2.0/token [office365-OLD] server=TLS Smtp.office365.com:587 popserver=Outlook.office365.com:995 client_id=xxxxx client_secret=xxxx token_uri=https://login.microsoftonline.com/xxxxx/oauth2/v2.0/token refresh_token=xxxxx ----------------------------------------
1. アプリケーションの登録
任意の名前でかまいません。
リダイレクトURLも任意な存在しないURLで構いません。http://localhost/myapp/。
2. クライアントIDとテナントID、オブジェクトID、テナントIDをコピー
3. クライアントシークレット作成&コピー
[証明書またはシークレットの追加]をクリック。
[新しいクライアントシークレット]をクリック。
シークレットをコピーします。
4. APIのアクセス許可の追加
[APIのアクセス許可]-[アクセス許可の追加]をクリック。
Microsoft Graph User.Read は、デフォルトで追加されるようです。
この項目は、そのままで構いません。
[所属する組織で使用しているAPI]-[Office 365 Excange Online]をクリック。
以下の2つを選択して追加します。
APIアクセス許可の要求項目の選択方法は、[アクセス許可を選択する]テキストボックスに、 POP でエンターキー、 POP.AccessAsApp を選択。 次にSMTP を入力して SMTP.SendAsApp を選択します。
状態の文字がグリーンになっているか確認します。
PowerShellコマンド内で、以下のIDやメールアドレスを使います。 ・テナントID ・EntraアプリケーションID(クライアントID) ・EntraアプリケーションオブジェクトID ....エンタープライズアプリケーションの概要画面からコピペしてください。 ・BASP21 Proで使うメールアドレス (1)PowerShellを管理者で起動 (2)モジュールをインストール (初回のみ) PS > Install-Module -Name ExchangeOnlineManagement 続行するには NuGet プロバイダーが必要です PowerShellGet で NuGet ベースのリポジトリを操作するには、'2.8.5.201' 以降のバージョンの NuGet プロバイダーが必要です。NuGet プロバイダーは 'C:\Program Files\PackageManagement\ProviderAssemblies' または 'C:\Users\CSJW10-08\AppData\Local\PackageManagement\ProviderAssemblies' に配置する必要があります。'Install-PackageProvider -Name NuGet -MinimumVersion 2.8.5.201 -Force' を実行して NuGet プロバイダーをインストールすることもできます。今すぐ PowerShellGet で NuGet プロバイダーをインストールしてインポートしますか? [Y] はい(Y) [N] いいえ(N) [S] 中断(S) [?] ヘルプ (既定値は "Y"): Y 信頼されていないリポジトリからモジュールをインストールしようとしています。このリポジトリを信頼する場合は、Set-PSReposit ory コマンドレットを実行して、リポジトリの InstallationPolicy の値を変更してください。'PSGallery' からモジュールをインストールしますか? [Y] はい(Y) [A] すべて続行(A) [N] いいえ(N) [L] すべて無視(L) [S] 中断(S) [?] ヘルプ (既定値は "N"): Y PS > (3)モジュールをロード (初回のみ) PS > Import-module ExchangeOnlineManagement (4)テナントに接続 テナントIDを指定 PS > Connect-ExchangeOnline -Organization テナントID ブラウザが開くので管理者でログインしてください。 ---------------------------------------------------------------------------------------- This V3 EXO PowerShell module contains new REST API backed Exchange Online cmdlets which doesn't require WinRM for Client-Server communication. You can now run these cmdlets after turning off WinRM Basic Auth in your client machine thus making it more secure. Unlike the EXO* prefixed cmdlets, the cmdlets in this module support full functional parity with the RPS (V1) cmdlets. V3 cmdlets in the downloaded module are resilient to transient failures, handling retries and throttling errors inherently. REST backed EOP and SCC cmdlets are also available in the V3 module. Similar to EXO, the cmdlets can be run without WinRM basic auth enabled. For more information check https://aka.ms/exov3-module ---------------------------------------------------------------------------------------- (5)Entra アプリケーションのサービス プリンシパルの登録 EntraアプリのアプリケーションIDとオブジェクトIDを指定。 PS > New-ServicePrincipal -AppId アプリケーションID -ObjectId アプリケーションオブジェクトID 注意:ここで以下のエラーが発生することがあります。
エラー: AADServicePrincipalNotFound。クライアント アプリケーション ID 'xxxxxxxxxxx' のオブジェクト ID 'xxxxxx'の ServicePrincipal は、
このテナントに登録されていません。 このエラーの回避策ですが、 オブジェクトIDが誤っていますので、 Entraアプリケーションの管理画面から、 エンタープライズアプリケーションの概要画面からコピペしてください。
以下のように[アプリ登録]-[概要]からコピペすると違うオブジェクトIDとなります。
(6)アプリケーションのサービス プリンシパルに 1 つのメールボックスへのアクセス権を付与。 PS > Add-MailboxPermission -Identity メールアドレス -User アプリケーションオブジェクトID -AccessRights FullAccess (7)アプリケーションのサービス プリンシパルに SendAs (メールボックス所有者として送信する) 権限の付与。 PS > Add-RecipientPermission -Identity メールアドレス -Trustee アプリケーションオブジェクトID -AccessRights SendAs (8)テナント切断 PS > Disconnect-ExchangeOnline
ツール(office365-oauth2-2025.vbs ファイル)のダウンロードは、 こちら。
使用するscope は、以下の通りです。
POP・SMTP共通 ..... https://outlook.office365.com/.default
1. ツールで認証コードを取得
office365-oauth2-2025.vbs ファイルをエディタで開いて、●●部分を埋め込みます。
office365-oauth2-2025.vbs ファイルの内容。 ''============================================== DATEX = Replace(Date(),"/","") ENTRAAPP="●●" '.... Entra アプリケーション名 コメントとして使うので任意な名前で構いません CID="●●" '... クライアントID CSS="●●" '... クライアントシークレット TID="●●" '... テナントID '' ログファイル LOGFILE="C:\●●\#EAP#-vbslog#DATE#.txt" LOGFILE=Replace(LOGFILE,"#EAP#",ENTRAAPP) LOGFILE=Replace(LOGFILE,"#DATE#",DATEX) ' '' curl トレースファイル CURLTRACE="--trace-ascii C:\●●\#EAP#-curllog#DATE#.txt" CURLTRACE=Replace(CURLTRACE,"#EAP#",ENTRAAPP) CURLTRACE=Replace(CURLTRACE,"#DATE#",DATEX) '==============================================office365-oauth2-2025.vbs ファイルをダブルクリックして実行します。
以下のようにアクセストークンとbasp21p.ini設定項目がログファイル(LOGFILE)に書込みがあればOK。
-------------- basp21p.ini ------------- access_token=................. [office365-20250104] # 2025/01/04 Office365 OAuth2 BTEST-06 allow=all sslver=12 server=TLS Smtp.office365.com:587 popserver=Outlook.office365.com:995 client_id=xxxxx client_secret=xxxx token_uri=https://login.microsoftonline.com/xxxxx/oauth2/v2.0/token ----------------------------------------この basp21p.iniの設定項目をbasp21p.ini ファイルにコピペします。
basp21p.iniファイルに取得済みのパラメータを設定します。 [global] license=.... allow=all [office365] allow=all mailfrom=account,account:XOAUTH2 logfile=c:\wk\office365-log.txt server=TLS Smtp.office365.com:587 popserver=Outlook.office365.com:995 client_id=.... client_secret=.... token_uri=https://login.microsoftonline.com/..../oauth2/v2.0/tokenメール送信vbscriptサンプルは以下のようになります。
'' office365mailsend.vbs Set bobj = CreateObject("basp21pro") bobj.Env="office365" mailto="送信先アドレス" subject="件名1" body="ハローoffice" files="" rc = bobj.SendMail(mailto,subject,body,files) Wscript.Echo "done rc1=" & rcSMTPプロトコルのコマンドシーケンスは、以下のようになります。
C: AUTH XOAUTH2 S: 334 C: dXNlcj10Y...................... S: 235 2.7.0 Authentication successful C: MAIL FROM:[接続が続きます...]
basp21p.iniファイルに取得済みのパラメータを設定します。 [global] license=.... allow=all [office365] allow=all logfile=c:\wk\office365-log.txt popserver=outlook.office365.com:995 client_id=クライアントID1 client_secret=クライアントシークレット1 token_uri=https://login.microsoftonline.com/..../oauth2/v2.0/tokenメール受信vbscriptサンプルは以下のようになります。
'' office365rcv.vbs Set bobj = CreateObject("basp21pro") bobj.Env="office365" ''''' パスワードとして XOAUTH2(固定値)を指定 ar = bobj.RcvMail("xxx@xxxx.co.jp","XOAUTH2","stat") If isarray(ar) Then msg= "done: メール数:" & replace(ar(0)," "," バイト数:") Else msg = bobj.lastmsg End If wscript.echo msgPOP3プロトコルのコマンドシーケンスは、以下のようになります。
S: +OK The Microsoft Exchange POP3 service is ready. C: AUTH XOAUTH2 S: + C: dXNlcj10Y..................... S: +OK User successfully authenticated. C: STAT S: +OK 255 10389053 [接続が続きます...]
(1)PowerShellを管理者権限で起動 (2)Mail.Protocolsをインストール (初回のみ) PS > Install-Module Mail.Protocols 信頼されていないリポジトリ 信頼されていないリポジトリからモジュールをインストールしようとしています。 このリポジトリを信頼する場合は、Set-PSRepository コマンドレットを実行して、リポジトリの InstallationPolicy の値を変更してください。'PSGallery' からモジュールをインストールしますか? [Y] はい(Y) [A] すべて続行(A) [N] いいえ(N) [L] すべて無視(L) [S] 中断(S) [?] ヘルプ (既定値は "N"): Y (3)Test-MsPopConnection実行 PS > Test-MsPopConnection Please input log file path. If empty, it applies the default path of the app. Typically under \logs of current directory.: ログファイルフルパス Please input the Azure Cloud Instance of interest. (1. AzurePublic, 2. AzureChina, 3. AzureUsGovernment.): 1 Please input the mailbox to connect.: メールアドレス Please input the authentication type. (1. OAuth, 2. Basic Auth **has deprecated in most tenants**.): 1 Do you want to access the mailbox as user delegation (login window will prompt for authentication) or as app (a secret will be needed for authenticaiton)? (1. User delegation, 2. App.): 2 Please input your tenant Id. Input empty string if your app is registered as a multiple-tenant app.: テナントID Please input your client Id (aka application id).: クライアントID Please input the secret of the registered app.: クライアントシークレット C Connecting to server 'outlook.office365.com' on port 995. S +OK The Microsoft Exchange POP3 service is ready. [VABZA...] C AUTH XOAUTH2 S + C xxxxxxxxxxxxxxxxxxxxxx S +OK User successfully authenticated. C LIST S +OK 480 62669336 S 1 35884 S 2 119995 エラーの場合は、以下のようになります。 S -ERR Authentication failure: unknown user name or bad password. It is not a valid AccessToken. A valid AccessToken must have either a roles or scp claim. C Connection is closed. 警告: Something is wrong. Please review the log 指定したログファイルフルパス PS > 認証コードフロー方式は、Test-MsPopConnectionは、失敗するようです。 エラーの場合、チェック項目は、以下のとおりです。 (1)アプリケーションID、やクライアントID、オブジェクトIDの確認 (2)サービス プリンシパル登録の確認 ・ExchangeOnlineに接続 PS > Connect-ExchangeOnline -Organization <テナントID> ・Entra アプリケーションのサービス プリンシパル登録の確認 PS > Get-ServicePrincipal | fl ・アプリケーションのサービス プリンシパルのメールボックスへのアクセス権確認 PS > Get-MailboxPermission -Identity メールアドレス | FL PS > Get-RecipientPermission -Identity メールアドレス | FL (3)EntraアプリケーションAPI許可に管理者の同意があるか確認