利用Microsoft Graph開發微軟的Exchange Calendar會議、Team

啟明星工作室發表於2021-10-30

Microsoft Graph是什麼?

Microsoft Graph 是 Microsoft 365 中通往資料和智慧的閘道器。 它提供統一的可程式設計模型,可用於訪問 Microsoft 365、Windows 10 和企業移動性 + 安全性中的海量資料。 

這句話來自微軟的官網介紹,聽起來很拗口,簡單的說,就是微軟的API。

在理解Microsoft Graph之前,你需要知道Microsoft365能做什麼?答案是,能做微軟提供的所有線上服務。

這裡,除了常見的Web開發,還包括Network,Office,AD域,安全,物聯網,AI,域名等等。

 

 

 

整個系統,就像計算機“圖論”裡的一個“Graph”,把 人,機器,日曆,任務,會議,檔案 等連線在了一起。

這或許就是被叫做Microsoft Graph而不叫Microsoft API的原因。

 

 

 

2.註冊自己的App

Microsoft Graph開發的第一步,就是要註冊自己的App,在微軟雲後臺裡,註冊自己的App,能夠獲取到2個重要的引數:

Application (client id) ID和 Directory (tenant id) ID。

Application ID是系統識別每一個應用程式,而Directory ID是租戶的標識。(這2個引數非常重要,後面會說要獲取Token。)

 

3.增加金鑰

在獲取Token時,還需要傳遞金鑰,金鑰可以認為是ApplicationID的密碼,因為ApplicationID是固定的,而金鑰則允許管理員定期修改。

點選“New Client Secret”就可以了,讓系統隨機生成金鑰。

 

 

 

4.獲取Token

Token令牌就像你在公司裡“員工證”。有了Token以後,你就可以讀取Microsoft Graph提供的介面了(且慢,還要授權),

 下面是一個POST示意網址,用來生成Token,

https://login.microsoftonline.com/{tenant_id}/oauth2/v2.0/authorize?client_id=11111111-1111-1111-1111-111111111111
&response_type=code&redirect_uri=http%3A%2F%2Flocalhost%2Fmyapp%2F&response_mode=query
&scope=offline_access%20user.read%20mail.read&state=12345

 

簡單分解一下上面網址,

首先,POST網址到 https://login.microsoftonline.com/{tenant}/oauth2/v2.0/authorize,然後帶上client_id引數

 

{
    "token_type": "Bearer",
    "scope": "user.read%20Fmail.read",
    "expires_in": 3600,
    "access_token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiIsIng1dCI6Ik5HVEZ2ZEstZnl0aEV1Q...",
    "refresh_token": "AwABAAAAvPM1KaPlrEqdFSBzjqfTGAMxZGUTdM0t4B4..."
}

  

當成功後,系統會返回一個JSON字串,其實字串裡包含你想要的Access Token令牌。

另外幾個引數,例如 expires_in 表示token有效期為3600秒,每一次呼叫token,系統都會返回不同的token。

但是,如果頻繁呼叫,有可能Microsoft有次數限制,因此,在獲取token後,通常你要儲存在本地,每次直接從本機上讀取,

而不是每次都要到伺服器上獲取。

 

5.生成 Bearer token

在上面獲取的token有一個token_type,也許後期會變,但是感覺變化可能性極低。什麼是Bearer token?Bearer的中文翻譯是持有人,其實Bearer token是什麼鬼,

你也不用管那麼多,反正就是“Bearer+空格+Token” 就生產了。在程式裡,直接拼湊即可。

例如:

Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiIsIng1dCI6Ik5HVEZ2ZEstZnl0aEV1Q...

這個作為Request的Header的Authorization的值。

例如,你要獲取公司裡前5個人的列表,直接Get請求下面網址時,Microsoft Graph會先從Header裡提取Authorization判斷您的許可權,然後返回結果。

https://graph.microsoft.com/v1.0/users?$top=5  

如果使用.NET基本程式碼如下:  

string token="Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiIsIng1dCI6Ik5HVEZ2ZEstZnl0aEV1Q..."; 
string url="https://graph.microsoft.com/v1.0/users?$top=5";
WebRequest request = (WebRequest)HttpWebRequest.Create(url);
request.Method = "Get"; request.Headers.Set("Authorization", token);

  

6.應用授權

預設,Token的許可權非常低,他僅能讀取個人資訊,接下來要對API 授權,給與App更多的許可權。

在 API permissions 裡,點選 Add a permission,然後選擇對應的許可權,再點選“Grant Admin consent” 授權

 

 

7.讀取Windows365裡的使用者日曆或者會議室日曆

在Microsoft Graph裡,列出了大量介面,例如 List calendars - Microsoft Graph v1.0 | Microsoft Docs

在每一個介面裡,都簡單的表示請問方式和網址。GET表示此請求需要使用GET方式獲取。POST 表示此請求需要以POST方式獲取。

/me/calendars 表示請求的地址是 https://graph.microsoft.com/me/calendars

 

 請求發出後,系統會返回JSON格式的內容,利用第三方外掛,可以解析這些JSON字串

HTTP/1.1 200 OK
Content-type: application/json

{
    "@odata.context": "https://graph.microsoft.com/v1.0/$metadata#me/calendars",
    "value": [
        {
            "@odata.id": "https://graph.microsoft.com/v1.0/users('ddfcd489-628b-40d7-b48b-57002df800e5@1717622f-1d94-4d0c-9d74-709fad664b77')/calendars('AAMkAGI2TGuLAAA=')",
            "id": "AAMkAGI2TGuLAAA=",
            "name": "Calendar",
            "color": "auto",
            "changeKey": "nfZyf7VcrEKLNoU37KWlkQAAA0x0+w==",
            "canShare":true,
            "canViewPrivateItems":true,
            "hexColor": "",
            "canEdit":true,
            "allowedOnlineMeetingProviders": [
                "teamsForBusiness"
            ],
          
    ]
}

  

 8.使用微軟的SDK-Microsoft Graph .NET Client Library

 微軟提供了Java/Asp.net/Php等各種語言的SKD,對於.NET而言, https://github.com/microsoftgraph/msgraph-sdk-dotnet 是.NET的SDK

 這些SDK封裝了各種驗證,直接提供簡單的類庫呼叫。獲取Microsoft Driver只要一句程式碼即可。

var drive = await graphClient.Me.Drive.Request().GetAsync();

  

 

 

當你熟悉了上面的操作後,讀取Microsoft 365 Exchange的日曆,會議資訊, 建立 Microsoft Team視訊會議, 獲取AD域裡使用者郵件等等都變的非常簡單。

 

相關文章