Oauth2認証フロー名称 | 認可コードフロー | クライアントクレデンシャルフロー |
---|---|---|
マイクロソフト社実装名称 | 認証コードフロー | クライアント資格情報付与フロー |
BASP21 Pro OAuth2認証リンク | 本ページ | basp21poauth2-365-2025.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 | クライアントシークレット | クライアントシークレット |
refresh_token | リフレッシュトークン | リフレッシュトークン |
token_uri | アクセストークン取得URL | OAuth 2.0 トークン エンドポイント (v2) https://login.microsoftonline.com/(テナントID)/oauth2/v2.0/token |
server | office365 SMTPサーバー | Smtp.office365.com TLS Smtp.office365.com:587 |
mailfrom | MailFrom | 送信元メールアドレス,office365アカウント:XOAUTH2 |
popserver | office365 POPサーバー | Outlook.office365.com:995 |
basp21p.iniファイルに設定が必要なパラメータを取得するために
承認エンドポイント/トークンエンドポイントを呼出します。
その際にコマンドプロンプトで curl コマンドを使います。
curl コマンドは、Windows 10に標準インストールされています。
コマンドプロンプトで curl -V で確認できます。
C:\>curl -V curl 7.55.1 (Windows) libcurl/7.55.1 WinSSL Release-Date: [unreleased] Protocols: dict file ftp ftps http https imap imaps pop3 pop3s smtp smtps telnet tftp Features: AsynchDNS IPv6 Largefile SSPI Kerberos SPNEGO NTLM SSL C:\>インストールされてない場合は、インストールが必要です。
-86 OAUTH2認証エラー。 (ログ) 2020/11/02 16:20:07.216 3948-6294376 office365(32bit WOW64) RcvMail HTTP > POST /a7a81c19-a273..... 2020/11/02 16:20:07.528 3948-6294376 office365(32bit WOW64) RcvMail HTTP < HTTP/1.1 400 Bad Request 2020/11/02 16:20:07.528 3948-6294376 office365(32bit WOW64) RcvMail ERROR:-52 [SYSTEM]server error HTTP/1.1 400 Bad Request 2020/11/02 16:20:07.528 3948-6294376 office365(32bit WOW64) RcvMail end -86 (842msec) トークンサーバーのアクセスでHTTP 400エラーとなります。
1. アプリケーションの登録。
任意の名前でかまいません。
リダイレクトURL。http://localhost/myapp/。
2. クライアントIDとテナントIDをコピー。
3. クライアントシークレット作成&コピー
任意の説明。任意の有効期限。追加をクリック。
ここで1年や2年を指定すると期限後に
BASP21 Pro メールによるSMTP/POP3 アクセスが失敗します。
その場合、新規にクライアントシークレット作成して、
承認エンドポイントから[認証コード]を取得する必要があります。
シークレットをコピーします。
4. APIのアクセス許可の追加
[APIのアクセス許可]-[アクセス許可の追加]をクリック。
[Microsoft Grapf]-[委任されたアクセス許可]をクリック。
以下の3つを選択して追加します。
APIアクセス許可の要求選択方法は、[アクセス許可を選択する]テキストボックスに、OFF でエンターキー、 offline_access Maintain access to data you have given it access to を選択。 次に POP でエンターキー、 POP.AccessAsUser.All Read and write access to mailboxes via POP. を選択。 次にSMTP を入力して SMTP.Send Send emails from mailboxes using SMTP AUTH. を選択します。
ツール(office365-oauth2.vbs ファイル)のダウンロードは、 こちら。
使用するscope は、以下の通りです。
POP ..... https://outlook.office.com/POP.AccessAsUser.All
SMTP .... https://outlook.office.com/SMTP.Send
1. ツールで認証コードを取得
office365-oauth2.vbs ファイルをエディタで開いて、●●部分を埋め込みます。
office365-oauth2.vbs ファイルの内容。 ''============================================== '' ログファイルセット LOGFILE="C:\●●slog.txt" '' curl トレースファイルセット CURLTRACE1="--trace-ascii C:\●●clog1.txt" CURLTRACE2="--trace-ascii C:\●●clog2.txt" 'クライアントIDをセット CID="●●" 'クライアントシークレットをセット CSS="●●" 'テナントIDをセット TID="●●" '==============================================office365-oauth2.vbs ファイルをダブルクリックして実行します。
2.認証コード取得
ブラウザが自動起動しますので認証コードを取得します。
ブラウザでURLを叩くと同意画面が表示されます。
使用するアカウントを選択。
このとき、BASP21 Pro で使うメールアドレスで認証してください。
ツールで再度、認証コード取得からやり直す場合は、 以下のように2つの変数をクリアしてください。
office365-oauth2.vbs ファイルの内容。 '' 変数クリア ACC="" REF=""
[承諾]をクリック。
ブラウザのURL部分で表示される認証コードをコピーして、
office365-oauth2.vbs ファイル内にセットします。
?code=xxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxの部分です。
office365-oauth2.vbs ファイルの内容。 ' フェーズ@で取得した認証コードをセット 初期値は"" (変更前) ACC="" (変更後) ACC=".......認証コード..............." '==============================================
C:\>curl -V curl 7.55.1 (Windows) libcurl/7.55.1 WinSSL Release-Date: [unreleased] Protocols: dict file ftp ftps http https imap imaps pop3 pop3s smtp smtps telnet tftp Features: AsynchDNS IPv6 Largefile SSPI Kerberos SPNEGO NTLM SSL C:\>office365-oauth2.vbs ファイルをダブルクリックして実行します。
以下のようなjsonレスポンスがログファイル(LOGFILE変数にセットしたファイル)に表示されればOK。
2020/nn/nn 13:00:30:Aリフレッシュトークン取得フェーズ curl --trace-ascii C:\WK\clog1.txt -d "code=......" -d "client_id=......." -d "client_secret=....." -d "redirect_uri=...." -d "grant_type=authorization_code" -d "access_type=offline......" https://login.microsoftonline.com/..../oauth2/v2.0/token curl grant_type=authorization_code..... done. { { "token_type":"Bearer", "scope":"https://outlook.office365.com/POP.AccessAsUser.All https://outlook.office365.com/SMTP.Send", "expires_in":3599, "access_token": "...............", "refresh_token": "..............", } access_token=................. refresh_token内容を 変数REFに設定 refresh_token=.................. done.このjsonレスポンスで必要なものは、リフレッシュトークンのみです
office365-oauth2.vbs ファイルの内容。 ' フェーズAで取得したリフレッシュトークンをセット 初期値は"" (変更前) REF="" (変更後) REF=".......リフレッシュトークン..............." '==============================================
以下のようなjsonレスポンスがログファイルに表示されればOK。
2020/nn/nn 13:01:02:Bリフレッシュトークンによるアクセストークン取得テスト curl --trace-ascii C:\WK\clog2.txt -d "client_id=....." -d "client_secret=....." -d "grant_type=refresh_token" -d "refresh_token=....." https://login.microsoftonline.com/.../oauth2/v2.0/token curl grant_type=refresh_token..... done. { "token_type": "Bearer", "scope": "https://outlook.office365.com/POP.AccessAsUser.All https://outlook.office365.com/SMTP.Send", "access_token": ".....", "expires_in": 3599 } リフレッシュトークンによるアクセストークン取得テスト完了 access_token=...... -------------- basp21p.ini ------------- [office365] # 2020/../.. Office365 OAuth2 allow=all 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 refresh_token=..... ---------------------------------------- done.最後に表示される 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 refresh_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 refresh_token=リフレッシュトークン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")POP3プロトコルのコマンドシーケンスは、以下のようになります。
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 [接続が続きます...]