欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

3、认证的相关内容(委托权限的认证过程)

程序员文章站 2024-02-23 09:25:58
...

感谢大家继续花时间阅读我的文章。上次我说了学习认证的一些准备工作,在Azure AD上注册好应用后,在成功去调用API之前,必不可少的步骤就是认证过程了。其实认证过程从原理上讲很容易,Graph API是REST API,在使用http方法的时候,总要携带认证凭据进行调用。Graph API认证的凭据类型为Bearer Token,也就是在你发送的每一条Graph API指令中,你都需要在其头文件中包含此凭据。

3、认证的相关内容(委托权限的认证过程)

图为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的参数,这个参数好长。

3、认证的相关内容(委托权限的认证过程)

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