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是做什么用的呢?我们以后再慢慢道来。

发布了5 篇原创文章 · 获赞 13 · 访问量 1030

猜你喜欢

转载自blog.csdn.net/isaac618/article/details/105218024
今日推荐