You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Microsoft Graph模块获取委托权限AccessToken遇401未授权问题

解决自定义API调用401未授权问题

问题原因

你用Connect-MgGraph完成的认证,默认拿到的是Microsoft Graph服务专用的访问令牌,这个令牌只能调用Graph API,没法用于你的自定义API(api://$serviceId),所以才会返回401未授权。

必要前置配置

先确认两个应用注册的配置没问题:

  • 客户端应用($appId)已经添加了自定义API($serviceId)的委托权限MyData.FullControl.All,如果是租户级权限,必须完成管理员同意。
  • 自定义API的应用注册里,已经在「公开API」页面正确暴露了MyData.FullControl.All这个范围。

修正后的PowerShell代码

用Get-MgAccessToken专门获取自定义API的访问令牌,再用标准HTTP请求cmdlet调用你的服务:

$tenantId = '00000000-0000-0000-0000-000000000000'
$appId = '00000000-0000-0000-0000-000000000000'
$serviceId = '00000000-0000-0000-0000-000000000000'
# 定义自定义API的权限范围
$customApiScopes = "api://$serviceId/MyData.FullControl.All offline_access"

# 安装并导入Microsoft Graph模块
Install-Module Microsoft.Graph -Scope CurrentUser -Repository PSGallery -Force
Import-Module Microsoft.Graph.Authentication

# 设备码流认证,指定自定义API的范围
Connect-MgGraph -ClientId $appId -TenantId $tenantId -Scopes $customApiScopes -UseDeviceCode -NoWelcome

# 获取针对自定义API的访问令牌
$accessToken = Get-MgAccessToken -Scope $customApiScopes

# 调用自定义API
$headers = @{
    'Accept' = 'application/json'
    'Authorization' = "Bearer $($accessToken.Token)"
}

Invoke-RestMethod -Method GET `
    -Uri 'https://my-service-endpoint.azurewebsites.net/api/data/01' `
    -Headers $headers `
    -ContentType 'application/json'

几个关键点

  1. 别用Invoke-MgGraphRequest调用自定义API:这个cmdlet是专门为Microsoft Graph API设计的,会自动附加Graph相关请求头,不适合第三方服务。
  2. Get-MgAccessToken的作用:它可以根据指定范围,获取对应资源的访问令牌,完美解决默认Graph令牌不兼容自定义API的问题。
  3. 离线访问支持:如果你需要长期使用令牌,offline_access范围会返回刷新令牌,后续可以用它获取新的访问令牌,无需重新认证。

内容的提问来源于stack exchange,提问作者Daniel M.

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 22:02:39