かずきのBlog@hatena

すきな言語は C# + XAML の組み合わせ。Azure Functions も好き。最近は Go 言語勉強中。日本マイクロソフトで働いていますが、ここに書いていることは個人的なメモなので会社の公式見解ではありません。

Office 365の機能を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時間程度なので、この処理はいらないかもしれないですね…。