こんにちは。CData Software Japan リードエンジニアの杉本です。
前回の記事では Dynamics CRM の APIで使用されている「Ws-Trust Authentication」の廃止について触れましたが、今回は CData Exchange Driverで利用されている基本認証についても触れておこうと思います。
www.cdata.com
Exchange Online 基本認証の廃止 について
下記MSDNやExchange Team Blogにある通り、Exchange Onlineの基本認証は2021年後半に廃止されることが決定されています。
Exchange Online の基本認証は、2021 年の後半の廃止に先立ち、複数のプロトコルに対して非推奨となります。 基本認証では、すべての要求に対してユーザー名とパスワード (通常はデバイスに保存されている) の送信が使用されるため、特に TLS 保護が行われていない場合は、攻撃者によってユーザーの資格情報が盗み出されるリスクが高まります。
docs.microsoft.com
techcommunity.microsoft.com
対象となるAPIはCData Exchange Driverでも使用されている「Exchange Web Service」だけでなく
「POP」「SMTP」「IMAP」といった、メッセージングサービスのプロトコルも対象になっています。
実はこう捉えると、かなり影響範囲が広いですよね?
対処方法について
対応はシンプルです。基本認証からOAuth 2.0を用いた認証に切り替えます。
(OAuth は認可プロトコルなんじゃー、というコメントもあるかと思いますが、ここではAPIアクセスの過程を総称して、認証と用いました)
なんだか「レガシー認証」とか「モダン認証」とか「ModernAuth」とか色んな言葉が飛び交っていますが、ID・PWを用いたBasic Authentication(基本認証)から、Azure AD ベースの OAuth 2.0 に変わると捉えて良いでしょう。
なお、上記MDSNでは「まもなく「POP」「SMTP」「IMAP」もOAuth 2.0 で接続できるようになるよー」と書かれていますが、すでにリリースされているみたいですね。
techcommunity.microsoft.com
メールクライアントであれば、最新のOutlookの場合すでにOAuth 2.0による接続がサポートされています。
以前は左側のログインが出てきていたところが、右側のアクセス方式に変わっていると思います。その他のメールクライアントは公式ページなどで対応状況を確認しましょう。
基本認証とは?
せっかくなので、基本認証がどのように動いているかだけ、ちょっと抑えておきましょう。
CData Exchange Driverでは、以下のように「Auth Scheme」で「Basic」を選択し、User・Passwordの項目を入力して接続を行うと、基本認証でExchange Web Serviceに接続されます。
この接続テストをFiddlerでキャプチャすると、以下のようになっていて「Authorization: Basic c3VnaW1vdG9rQGNkYXRhLmNvbTpmc2Rmd2Vmd2Vmd2Vmc2Y=」の部分が基本認証の設定値になります。(ダミーデータです)
POST https://outlook.office365.com/EWS/Exchange.asmx HTTP/1.1
Host: outlook.office365.com
Authorization: Basic c3VnaW1vdG9rQGNkYXRhLmNvbTpmc2Rmd2Vmd2Vmd2Vmc2Y=
Accept-Encoding: gzip, deflate
User-Agent: CData Data Provider Engine - www.cdata.com - Accepts: gzip
Content-Type: text/xml; charset=utf-8
Content-Length: 830
xml version="1.0" encoding="utf-8"
<soapEnvelope xmlnssoap="http://schemas.xmlsoap.org/soap/envelope/"
xmlnst="http://schemas.microsoft.com/exchange/services/2006/types"
xmlnsm="http://schemas.microsoft.com/exchange/services/2006/messages"
xmlnsxsi="http://www.w3.org/2001/XMLSchema-instance">
<soapHeader>
<tRequestServerVersion Version="Exchange2013_SP1" />
soapHeader>
<soapBody>
<mFindItem Traversal="Shallow">
<mItemShape>
<tBaseShape>IdOnlytBaseShape>
mItemShape>
<mIndexedPageItemView MaxEntriesReturned="1000" Offset="0" BasePoint="Beginning"/>
<mParentFolderIds>
<tDistinguishedFolderId Id="inbox"/>
mParentFolderIds>
mFindItem>
soapBody>
soapEnvelope>
これは、UserId:Passwordをコロンで結合して、Base64エンコードして送信しています。
ja.wikipedia.org
CData Exchange Driver で OAuth 2.0 を使って接続する方法
CData Exchange Driverでは最新バージョンだとすでにOAuth 2.0のサポートをしています。
設定は簡単で、「Auth Scheme」で「OAuth」を選択して、接続するだけです。
この設定で接続テストをクリックすると、ブラウザが立ち上がり、以下のように接続許可を求める画面が表示されます。(必要に応じて対象のアカウントでログインしてください)
あとは承諾をクリックすれば、接続が完了します。
内部のリクエストを見てみると、AuthorizationヘッダーがOAuthの「Bearer」トークンベースに切り替わっていることが確認できます。
POST https://outlook.office365.com/EWS/Exchange.asmx HTTP/1.1
Host: outlook.office365.com
Authorization: Bearer eyJ0eXAiOiJKV1QiLCJub25jZSI6IktoTzVCMHhw....
Accept-Encoding: gzip, deflate
User-Agent: CData Data Provider Engine - www.cdata.com - Accepts: gzip
Content-Type: text/xml; charset=utf-8
Content-Length: 830
xml version="1.0" encoding="utf-8"
<soapEnvelope xmlnssoap="http://schemas.xmlsoap.org/soap/envelope/"
xmlnst="http://schemas.microsoft.com/exchange/services/2006/types"
xmlnsm="http://schemas.microsoft.com/exchange/services/2006/messages"
xmlnsxsi="http://www.w3.org/2001/XMLSchema-instance">
<soapHeader>
<tRequestServerVersion Version="Exchange2013_SP1" />
soapHeader>
<soapBody>
<mFindItem Traversal="Shallow">
<mItemShape>
<tBaseShape>IdOnlytBaseShape>
mItemShape>
<mIndexedPageItemView MaxEntriesReturned="1000" Offset="0" BasePoint="Beginning"/>
<mParentFolderIds>
<tDistinguishedFolderId Id="inbox"/>
mParentFolderIds>
mFindItem>
soapBody>
soapEnvelope>
CData Exchange Driver がサポートしているAPI
最後に少しだけ補足です。
現在CData Exchange DriverはデフォルトでSOAPベースのExhange Web Service(EWS)APIを利用するようになっていますが、Graph API ベースの接続にも切り替えることが可能です。
それぞれAPIの特性に応じてデータモデルが異なるので、ユースケースに併せて選択してください。
cdn.cdata.com
cdn.cdata.com
おそらく将来的にGraphAPIに一本化されるのではないか? とも思われるので、これから試される方はGraphAPIの利用がおすすめです。
もし、Graph APIベースのデータモデルを利用する場合は「Schema」の項目で「MSGraph」を選択して接続を行ってください。
関連コンテンツ