使用 Microsoft.Graph NuGet 套件 來存取 Office 365 行事曆的功能
現在要來使用 Microsoft.Graph 套件所提供的 API,進行新增一筆行事曆事件,想要使用這個功能,那就需要先完成前一篇的文章 使用 MSAL.NET 的 Resource Owner Password Credential ROPC 架構來取得存取權杖但是無須透過瀏覽器來進行身分驗證 的程式碼練習,透過該文章中的說明方法,就可以取得要存取 Microsoft Graph API 所需要用到的 Access Token。
在這篇文章所提到的專案原始碼,可以從 GitHub 下載。
建立測試專案
在這篇文章中,將會使用一個 Console 主控台應用程式類型的專案,來進行設計這樣的需求,也就是說,在無需與使用者互動,或者當時電腦環境沒有瀏覽器軟體的環境下,可以透過使用者帳號與密碼的方式,取得存取權杖 Access Token。因此,請先建立一個名為 MicrosoftGraphAPI 的 Console 專案,在這裡使用的是 .NET Framework 開發框架。並且把這篇文章 使用 MSAL.NET 的 Resource Owner Password Credential ROPC 架構來取得存取權杖但是無須透過瀏覽器來進行身分驗證 中的所有程式碼複製一分到這個專案內,並且使其可以正常運作。
安裝 Microsoft.Graph NuGet 套件
接著要來安裝 Microsoft.Graph 套件
- 滑鼠右擊此專案
- 選擇 [管理 NuGet 套件] 選項
- 點選瀏覽標籤頁次
- 在搜尋文字輸入盒內輸入這個文字 Microsoft.Graph
- 點選 安裝 按鈕
開啟該使用者的 Office 365 Outlook 的行事曆
首先,先來確認這個使用者的行事曆中,是沒有任何事件或者約會存在
開始設計新增一筆行事曆事件的程式碼
請在獲取 Access Token 之後的程式碼,建立一個型別為 GraphServiceClient 的執行個體,在這裡會在建構函式內傳入一個 DelegateAuthenticationProvider 物件,並且在此要指定剛剛取得的 Access Token 存取權杖值。
使用 底下的程式碼,建立一個 Event 物件,使其加入到這個使用者的行事曆內。
await graphServiceClient.Me.Events.Request(requestOptions)
.AddAsync(new Event
{
Subject = "自動同步行事曆測試" + Guid.NewGuid().ToString(),
Start = startTime,
End = endTime
});
請執行這個應用程式,確認有看到 新的行事曆事件已經建立成功 文字顯示出來。
最後,請檢查該使用者 Outlook 行事曆中,是否有這筆新事件產生出來。
這是這篇文章使用到的程式碼
class Program
{
static string clientId = "應用程式 (用戶端) 識別碼";
static string authority = "目錄 (租用戶) 識別碼";
static string account = "Office 365 使用者的電子郵件信箱";
static string password = "Office 365 使用者的密碼";
static void Main(string[] args)
{
GetMicrosoftGraphAccessTokeyAsync().Wait();
}
static async Task GetMicrosoftGraphAccessTokeyAsync()
{
string[] scopes = new string[] { "user.read" };
IPublicClientApplication app;
app = PublicClientApplicationBuilder.Create(clientId)
.WithAuthority($"https://login.microsoftonline.com/{authority}")
.Build();
AuthenticationResult result = null;
try
{
#region 將所提供的密碼,使用 SecureString 以加密的方式儲存
// SecureString 代表應該將文字保密,例如於不再使用時將它從電腦記憶體刪除。
var securePassword = new SecureString();
foreach (char c in password)
securePassword.AppendChar(c);
#endregion
// 使用使用者的帳號與密碼憑證,來獲取存取權杖
result = await app.AcquireTokenByUsernamePassword(scopes, account, securePassword)
.ExecuteAsync();
}
catch (MsalException ex)
{
Console.WriteLine(ex.Message);
}
Console.WriteLine(result.Account.Username);
Console.WriteLine($"Access Token : {result.AccessToken}");
foreach (var item in result.Scopes)
{
Console.WriteLine($"Scope :{item}");
}
var graphServiceClient = new GraphServiceClient(new DelegateAuthenticationProvider((requestMessage) =>
{
requestMessage
.Headers
.Authorization = new AuthenticationHeaderValue("bearer", result.AccessToken);
return Task.FromResult(0);
}));
List<Option> requestOptions = new List<Option>();
// 指定事件開始與結束時間
DateTimeTimeZone startTime = new DateTimeTimeZone
{
DateTime = DateTime.Now.AddDays(3).ToString("o"),
TimeZone = TimeZoneInfo.Local.Id
};
DateTimeTimeZone endTime = new DateTimeTimeZone
{
DateTime = DateTime.Now.AddDays(5).AddHours(1).ToString("o"),
TimeZone = TimeZoneInfo.Local.Id
};
// 新增這個事件
Event createdEvent = await graphServiceClient.Me.Events.Request(requestOptions)
.AddAsync(new Event
{
Subject = "自動同步行事曆測試" + Guid.NewGuid().ToString(),
Start = startTime,
End = endTime
});
if (createdEvent != null)
{
Console.WriteLine($"新的行事曆事件已經建立成功");
}
}
}