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


Exchange Online 開発

こんにちは。

遅くなってしまいましたが、CLR/H 勉強会の補足記事の 2 つ目です。(超遅れてすみません、7 月は、弊社の会計年度の始まりでして、ちょっといろいろ。。。)

今回は、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 と異なり、今風でないアクセス スタイルかもしれませんが、ご紹介したように、Exchange で通知 (Notification) や同期 (Synchronization)、その他 Outlook でおこなっている高度な処理を実装するには、現時点では この SOAP API を使うことになります。
このため、実アプリを開発する上で、今後もおぼえておいて損はないでしょう。

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

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

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

あとは、下記の通り、取得した Access Token を Authorization Header に設定して SOAP の処理 (EWS) を呼び出せば OK です。下記では、SOAP を使用してメールの送信をおこなっています。
SOAP なので、.NET (C#, Visual Basic) の開発者は、WCF を使って処理しても構いません。(ただし、WCF で Header を処理する際は、OperationContext などを使った特別な処理が必要です。)

POST https://outlook.office365.com/EWS/Exchange.asmx
Content-Type: text/xml; charset=utf-8
Accept: text/xml
Authorization: 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>

なお、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 と連携した認証・認可なども可能です。
さまざまな最新テクノロジに対応していますので、今でも高度な処理が必要になった際には現役で使用して頂けます !

 

Comments (0)

Skip to main content