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 服务的步骤大致相同。认证的过程如下:
- 无论是跳转还是直接访问,首先访问呢了如下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是做什么用的呢?我们以后再慢慢道来。