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); returnnull; } }); try { this.TextBlock.Text = (await this.Client.Me.ExecuteAsync()).DisplayName; } catch (DataServiceQueryException ex) { Debug.WriteLine(ex); this.TextBlock.Text = ex.Message; } }
ここでは表示名をとってきています。ちゃんと認証ができたかを確認するのと確実に認証ダイアログを出すために、最初は、こんな感じでユーザー名とかとってきておくのがいいかもしれません。
二度目以降は有効期限が切れるまでアクセストークンを使いまわすようにしています。ただ、有効期限を見ると1時間程度なので、この処理はいらないかもしれないですね…。