大家好,上次我们说了Graph API获取认证的两个方式之一的委托(用户名密码登录)的认证方式,本次让我们来说说应用程序权限的认证方法。
应用程序授权并不需要用户身份进行登录验证,但它需要管理员对其进行授权。在大多数情况下,你仅需点击Azure AD注册应用中的按钮进行授权:
但有时候,UI上的授权会不生效。想确保管理员一定对此应用进行了授权,可以访问一下以下网址(以中国版Azure AD为例):
https://login.chinacloudapi.cn/<Tenant ID>/adminconsent?client_id=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx&redirect_uri=http://localhost/
再次解释一下:
- 基于Azure AD 2.0,你可以把Tenant ID写为common,另外,即使些Tenant ID,也不需要加尖括号,直接些GUID即可;
- client_id,不多解释了,client_id就是注册应用的应用程序 ID
- redirect_uri,又叫做重定向URI,在身份验证中进行设置的,截图如下:
当你输入完成这样一个网址后,浏览器访问它,你会进入Azure AD的验证界面,此时需要使用管理员进行登录并授权:
当你点击接收后,浏览器会把你导航到你的重定向URI中,当然这个页面实际无所谓,重点是你已经为你注册的应用获得到了管理员授权。也是就说此时,该应用(服务主体)已经确保获得了无用户参与登录的访问权限,并拿到了一些权限。
接下来的步骤比较简单,应用程序获取登录认证不需要委托的认证那样,存在code这个中间量。而是直接去获取Access Token。
在给应用程序授予了管理员许可后,即可开始请求Access Token的过程。在应用程序的认证中申请凭证也需要POST http方法,即通过PostMan等工具或代码进行执行来实现。
具体的请求方法为(以中国版Azure AD举例):
https://login.partner.microsoftonline.cn/<Tenant ID>/oauth2/token,当然,还是可以将Tenant ID修改为common,Body中要填写的内容如下表:
名称 |
值 |
说明 |
client_id |
应用程序ID |
你注册应用的应用程序ID |
grant_type |
client_credentials |
固定填写 |
scope |
https://microsoftgraph.chinacloudapi.cn/.default |
固定格式,必须填写。国际版值为https://graph.microsoft.com/.default |
client_secret |
证书与密码中,客户端密码的值 |
必须填写。你可以随时在证书与密码中重新申请。 |
resource |
源,中国版请填写https://microsoftgraph.chinacloudapi.cn |
该地址只在连接中国版时需要且必须,如连接国际版,勿添加此参数 |
如果不出意外的话,你会得到类似如下反馈:
{
"token_type": "Bearer",
"expires_in": "3599",
"ext_expires_in": "3599",
"expires_on": "1585623335",
"not_before": "1585619435",
"resource": "https://microsoftgraph.chinacloudapi.cn",
"access_token": "eyJ0eXAiOiJKV1QiLCJub25jZSI6Ii……
}
你会发现,与通过用户名密码登录的情况不同,Azure AD只返回了access Token,当然这对应用程序来说也够用了,有关其他Token的情况,我还是留到下次再说吧。代码这次就不留了,和上次用户名密码通过code申请凭据的差不多,无非都是POST方法。
剩下的就是带着这个Token去调用API了,简单说明一下,你可以使用POSTMAN、Fiddler之类的工具,也可以开发完成。
POSTMAN中的测试极为简单,在Authorization 中,TYPE选为Bearer Token,将刚刚获取的Access Token粘贴在Token中,你可以去调用一个非常简单的API,如列出用户:
谢谢大家花时间阅读,下次我们讲一下之前漏掉的一些说明和情况。