3、認證的相關內容(委託權限的認證過程)

感謝大家繼續花時間閱讀我的文章。上次我說了學習認證的一些準備工作,在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 服務的步驟大致相同。認證的過程如下:

  1. 無論是跳轉還是直接訪問,首先訪問呢瞭如下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是做什麼用的呢?我們以後再慢慢道來。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章