Uncategorized

Exchange Online 開発 : EWS (Managed API) の OAuth Token 認証

Exchange Online 開発

注意 (重要) : クラウドの Exchange Online に対するデータアクセスには、今後 Microsoft Graph を使用してください。(2022/09/30 以降、Exchange Online 上で新規の EWS アプリの作成はできません。また、2026 年 01 月以降、Exchange Online の EWS の呼び出しはブロックされます。)

こんにちは。

今回は、SOAP の Exchange Web Services (EWS) における OAuth Token 認証の手順を紹介します。

Office 365 API 入門」にも記載しましたが、今後、Exchange Online (Office 365) の開発で API を使用する際は、可能な限り、Basic Auth ではなく、ここで紹介する OAuth を使った Token Auth を使用してください。(二要素認証、AD 連携、デバイス認証など、さまざまなメカニズムとの組み合わせが考えられるためです。)
EWS の SOAP API は、「Office 365 API 入門」で紹介した Exchange の REST API と異なり、今風でないアクセス スタイルかもしれませんが、高度な処理を実装する際に、今でも、この SOAP API が必要になることがあります。
このため、実アプリを開発する上で、今後もおぼえておいて損はないでしょう。

では、手順を記載します。(というほど、実は、大げさな話ではありません。。。)

まず、「Office 365 API 入門」で解説した手順で、Azure Active Directory に Application を登録し、必要な Permission を設定し、ブラウザー (Browser Component など) を使って Access token を取得します。(手順は「Office 365 API 入門」を参照してください。)
この際、今回は、EWS.AccessAsUser.All を設定します。SOAP API を使用するので (CRUD 処理ではないので)、下図の通り、Full Access の Permission を設定しておいてください。(GA 版で変更されました。)

ブラウザー (Browser Component など) で Access token を取得する際、下図のような Office 365 (Azure AD) の SignIn 画面 (下図) が表示されるので、ここに ID / パスワードを入力してログインします。
もちろん、MSAL (Microsoft Authentication Library) や Office 365 API の Library などを使って Access token を取得しても構いません。

補足 : Azure AD v2 endpoint を使用する場合には、scope として https://outlook.office.com/EWS.AccessAsUser.All を設定します。

あとは、下記の通り、取得した Access Token を Authorization Header に設定して SOAP の処理 (EWS) を呼び出せば OK です。
下記では、SOAP を使用してメールの送信をおこなっています。

POST https://outlook.office365.com/EWS/Exchange.asmxContent-Type: text/xml; charset=utf-8Accept: text/xmlAuthorization: Bearer eyJ0eXAiOiJKV...<?xml version="1.0" encoding="utf-8"?><soap:Envelope . . . >  <soap:Header>    <t:RequestServerVersion Version="Exchange2007_SP1" />    <t:TimeZoneContext>      <t:TimeZoneDefinition Id="Tokyo Standard Time" />    </t:TimeZoneContext>  </soap:Header>  <soap:Body>    <m:CreateItem MessageDisposition="SendAndSaveCopy">      <m:SavedItemFolderId>        <t:DistinguishedFolderId Id="sentitems" />      </m:SavedItemFolderId>      <m:Items>        <t:Message>          <t:Subject>test mail</t:Subject>          <t:Body BodyType="Text">Are you busy ?</t:Body>          <t:ToRecipients>            <t:Mailbox>              <t:EmailAddress>tsmatsuz@microsoft.com</t:EmailAddress>            </t:Mailbox>          </t:ToRecipients>        </t:Message>      </m:Items>    </m:CreateItem>  </soap:Body></soap:Envelope>

補足 : SOAP なので、.NET (C#, Visual Basic) の開発者は、WCF を使って処理しても構いません。ただし、WCF で Header を処理する際は、OperationContext などを使った特別な処理が必要です。

なお、EWS Managed API (.NET の API) を使用する場合は、以下の通り、Microsoft.Exchange.WebServices.Data.OAuthCredentials を使用します。

. . .using Microsoft.Exchange.WebServices.Data;. . .static void Main(string[] args){  string emailAddress = @"tsmatsuz@o365demo01.onmicrosoft.com";  ExchangeVersion ver = new ExchangeVersion();  ver = ExchangeVersion.Exchange2007_SP1;  ExchangeService sv = new ExchangeService(ver);  sv.TraceEnabled = true; // for debugging  sv.Credentials = new OAuthCredentials("eyJ0eXAiOiJKV...");  sv.Url = new Uri(@"https://outlook.office365.com/EWS/Exchange.asmx");  EmailMessage msg = new EmailMessage(sv);  msg.Subject = "test mail";  msg.Body = new MessageBody(BodyType.Text, "Are you busy ?");  msg.ToRecipients.Add("tsmatsuz@microsoft.com");  msg.SendAndSaveCopy();  Console.WriteLine("送信完了");  Console.ReadLine();}. . .

Exchange Web Services (EWS) および Managed API では、この他に、Office Add-ins (Office アドイン) の Mail Add-ins の Token の妥当性検証など、Office Add-ins と連携した認証・認可なども可能です。
さまざまな最新テクノロジに対応していますので、今でも高度な処理が必要になった際には現役で使用して頂けます !

 

Categories: Uncategorized

Tagged as: ,

3 replies»

Leave a Reply