読者です 読者をやめる 読者になる 読者になる

かずきのBlog@hatena

日本マイクロソフトに勤めています。XAML + C#の組み合わせをメインに、たまにASP.NETやJavaなどの.NET系以外のことも書いています。掲載内容は個人の見解であり、所属する企業を代表するものではありません。

Office 365の機能をUWPから叩く方法

UWP

Office 365のAzure ADでアプリケーションを作成します。ネイティブアプリケーションとして作成しておきます。 他のアプリケーションに対するアクセス許可でOffice 365 Exchange Onlineを追加して適当なアクセス許可を与えておきます。

クライアントIDを控えて準備は完了です。

UWPのプロジェクトに以下のパッケージをNuGetから追加します。

  • Microsoft.IdentityModel.Clients.ActiveDirectory
  • Microsoft.Office365.OutlookServices

そして、ボタンクリックイベントハンドラあたりに以下のコードを追加するとOKです。

private async void ButtonSignIn_Click(object sender, RoutedEventArgs e)
{
    var authContext = new AuthenticationContext(
        "https://login.microsoftonline.com/common");
    this.Client = new OutlookServicesClient(
        new Uri("https://outlook.office365.com/api/v1.0"),
        async () =>
        {
            var settings = ApplicationData.Current.LocalSettings;
            if (settings.Values.ContainsKey("ExpiresOn"))
            {
                var expiresOn = (DateTimeOffset)settings.Values["ExpiresOn"];
                if (expiresOn >= DateTimeOffset.Now)
                {
                    return (string)settings.Values["AccessToken"];
                }
            }
            try
            {
                var ar = await authContext.AcquireTokenAsync(
                    "https://outlook.office365.com",
                    "クライアントID",
                    new Uri("http://uwp.okazuki.jp"),
                    new PlatformParameters(PromptBehavior.Auto, false));
                settings.Values["ExpiresOn"] = ar.ExpiresOn;
                settings.Values["AccessToken"] = ar.AccessToken;
                return ar.AccessToken;
            }
            catch (AdalException ex)
            {
                Debug.WriteLine(ex);
                return null;
            }
        });
    try
    {
        this.TextBlock.Text = (await this.Client.Me.ExecuteAsync()).DisplayName;
    }
    catch (DataServiceQueryException ex)
    {
        Debug.WriteLine(ex);
        this.TextBlock.Text = ex.Message;
    }
}

ここでは表示名をとってきています。ちゃんと認証ができたかを確認するのと確実に認証ダイアログを出すために、最初は、こんな感じでユーザー名とかとってきておくのがいいかもしれません。

二度目以降は有効期限が切れるまでアクセストークンを使いまわすようにしています。ただ、有効期限を見ると1時間程度なので、この処理はいらないかもしれないですね…。