感謝大家繼續花時間閱讀我的文章。上次我說了學習認證的一些準備工作,在Azure AD上註冊好應用後,在成功去調用API之前,必不可少的步驟就是認證過程了。其實認證過程從原理上講很容易,Graph API是REST API,在使用http方法的時候,總要攜帶認證憑據進行調用。Graph API認證的憑據類型爲Bearer Token,也就是在你發送的每一條Graph API指令中,你都需要在其頭文件中包含此憑據。
圖爲PostMan中的憑據類型
那麼,基礎知識來了,Graph API有哪幾種獲取憑據的方法呢?答案是兩種,一種是通過用戶名和密碼的方式登錄,也就是有用戶參與的情況,即委託的權限認證;另一種是在沒有用戶參與的情況下,在Azure AD中註冊的應用直接調用API執行一些操作,即應用程序權限。有關應用程序權限的認證我會在下一次中進行說明,本文我們主要介紹委託的權限如何獲取認證。
當你在Office 365或者Azure上進行操作時,實質上是不同的服務主體在進行操作。如當你訪問郵箱,實際上是通過了服務主體Office 365 Exchange Online(App ID 00000002-0000-0ff1-ce00-000000000000)來訪問數據;當你訪問OneDrive 中的數據,實際上是通過了服務主體Office 365 SharePoint Online(App ID 00000003-0000-0ff1-ce00-000000000000)來進一步訪問SharePoint中的數據的。而且每個服務主體有不同的權限,進而進一步保證了安全性。
對於你之前註冊的應用,實際上也是一個服務主體,和登錄Exchange 服務或者SharePoint 服務的步驟大致相同。認證的過程如下:
- 無論是跳轉還是直接訪問,首先訪問呢瞭如下URL(以中國版Azure AD爲例):https://login.partner.microsoftonline.cn/<Tenant ID>/oauth2/authorize?client_id=xxxxxxx-xxxx-xxxxxxxx-xxxxxxxxxxxx&response_type=code&redirect_uri=http%3A%2F%2Flocalhost%2F&scope=user.read,這個URL的說明如下:
- 根據Azure AD 2.0的說明,你講Tenant ID替換爲common 也完全可以
- client_id的內容爲你註冊應用的應用程序ID
- response_type=code是固定格式,返回類型必須爲code
- redirect_uri是重定向URI,必須填寫,你可以在身份驗證中找到它,其中可以獲取或重新添加。
- scope參數也是一個必填參數,實際上與你之後獲得憑證的權限關係不大,但必須用一個。在我的示例裏我使用了user.read
2、在你訪問了這個網址後,瀏覽器或Web Browser控件會讓你輸入用戶名和密碼以進行的登錄。
3、登錄成功後,瀏覽器或Web Browser控件會返回到重定向URI的網址,並在之後添加一個名爲code的參數,這個參數好長。
4、下一步你要用到POST方法,也就是瀏覽器不能完成了,需要PostMan或者代碼開發,請求一個POST http方法,地址爲:
https://login.partner.microsoftonline.cn/<Tenant ID>/oauth2/token,當然,依然是你可以將Tenant ID修改爲common,Body中要填寫的內容如下表:
名稱 |
值 |
說明 |
client_id |
應用程序ID |
你註冊應用的應用程序ID |
grant_type |
authorization_code |
固定填寫 |
redirect_uri |
與步驟1中填寫的redirect_uri一致 |
重定向URI,必須填寫,你可以在身份驗證中找到它,其中可以獲取或重新添加 |
code |
步驟3中獲取的code信息 |
注意,步驟3中返回的參數不是隻有code,不要粘多了 |
client_secret |
證書與密碼中,客戶端密碼的值 |
當你的重定向URL是Web地址時,必須填寫。你可以隨時在證書與密碼中重新申請。 |
resource |
源,中國版請填寫https://microsoftgraph.chinacloudapi.cn |
該地址只在連接中國版時需要且必須,如連接國際版,勿添加此參數 |
這裏要注意的一點是,你獲取的Code的有效期僅有10分鐘,超時就會過期,需要重新申請。
一切順利的話,你會得到一些列信息,包括三個Token:ID Token、Access Token和reflash Token。其中,Access Token就是你需要的,以 Bearer + Access Token的形式加在http頭中,調用Graph API。
下面是一個C#的示例代碼,簡單描述了Post Token的這一過程(未涵蓋獲取code部分):
……
using Windows.Web.Http;
using System.Text;
private async void GetToken(string code)
{
try
{
WebRequest request = WebRequest.Create("https://login.partner.microsoftonline.cn/common/oauth2/token");
request.Method = "POST";
request.ContentType = "application/x-www-form-urlencoded";
string postData = "grant_type=authorization_code&code="+
code +
"&client_id=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx&”+
”redirect_uri=http%3A%2F%2Flocalhost%2F&”+
”client_secret=E5j1A4kM6R3tFku5xWufcKdg%3D&”+
”resource=https%3A%2F%2Fmicrosoftgraph.chinacloudapi.cn";
byte[] byteArray = Encoding.UTF8.GetBytes(postData);
Stream dataStream = await request.GetRequestStreamAsync();
dataStream.Write(byteArray, 0, byteArray.Length);
dataStream.Dispose();
WebResponse response = await request.GetResponseAsync();
dataStream = response.GetResponseStream();
StreamReader reader = new StreamReader(dataStream);
string responseFromServer = reader.ReadToEnd();
string ss = responseFromServer; //ss爲反饋回的內容,包含Access Token
}
catch (Exception ex)
{
…………
}
}
當然,你會發現,你所獲得的不止是Access Token,其他那兩個Token是做什麼用的呢?我們以後再慢慢道來。