对于图形 API 中的大多数 API 调用,我可以使用以下代码来检索访问令牌,然后向 API 发出请求,并且它成功了:
$resourceUrl = 'https%3A%2F%2Fgraph.microsoft.com%2F.default'
$body = "client_id=CLIENTID&scope=https://graph.microsoft.com/.default&client_secret={0}&grant_type=client_credentials" -f "TOKEN"
$auth = Invoke-RestMethod -Uri 'https://login.microsoftonline.com/TENANT/oauth2/v2.0/token' -Body $body -Method post -Verbose
$accesstoken = $auth.access_token
但是,使用FindMeetingTimes API,每当尝试发出POST请求时,我都会收到错误400。使用图形资源管理器中的令牌而不是具有相同 API 请求的令牌可以通过 powershell 正常工作。
我假设这是由于它需要委派权限,有没有办法检索一个访问令牌,我可以为此调用此终结点而无需用户事先登录? 由于这是在后台运行的服务。
谢谢。
一种解决方法是使用资源所有者密码凭据授予来获取访问令牌。
- 在 Azure AD 中选择应用程序所需的委托权限。
- 如有必要,授予管理员同意。
- 获取令牌
这是我的示例:
$scope="https://graph.microsoft.com/.default";
$grant_type="password";
$username="your account id, jack@hanxia.onmicrosoft.com";
$password="your account password";
$client_id="your client id, dc****96-****-****-****-ea****6da5e7";
$client_secret="1YWt*******************21";
$body = @{
scope = $scope
grant_type = $grant_type
username = $username
password = $password
client_id = $client_id
client_secret = $client_secret
}
$auth = Invoke-RestMethod -Uri 'https://login.microsoftonline.com/{your_tenant_name_or_id}/oauth2/v2.0/token' -Body $body -Method post -Verbose
$auth.access_token
还有另一种方法。它是使用刷新令牌获取新的访问令牌。以下是有关它的官方文档:刷新访问令牌