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

Azure ML脚本访问OneDrive报400错误:租户无SPO许可证

问题场景

在Azure ML脚本中访问OneDrive资源,当前使用的Azure账户为个人账户,待访问的OneDrive归属工作账户。程序执行时身份认证环节成功通过,控制台输出Authenticated!提示,但后续调用Microsoft Graph接口获取驱动器根目录时返回400客户端错误。
错误详情:

请求URL https://graph.microsoft.com/v1.0/drive/root 返回400 Bad Request,错误信息为Tenant does not have a SPO license。

原实现代码:

from O365 import Account

credentials = ('client id xxxx 6fb8a4', 'secret value xxxxx v6Hyoa2K')
account = Account(credentials,auth_flow_type='credentials',tenant_id='87xxxxx8-3db7f7',main_resource='myemail@email.com')

storage = account.storage()

if account.authenticate():
    print('Authenticated!')
    
my_drive = storage.get_default_drive() 
root_folder = my_drive.get_root_folder()

# iterate over the first 25 items on the root folder
for item in root_folder.get_items(limit=25):
    if item.is_folder:
        print(list(item.get_items(2))) # print the first two element on this folder.
错误触发原因
  • 代码使用auth_flow_type='credentials'客户端凭据流做应用级身份认证,该认证模式下签发的令牌对应的Azure AD租户未分配SharePoint Online(SPO)许可。OneDrive for Business服务底层完全依赖SharePoint Online,对应租户无有效SPO许可时,调用Graph的OneDrive相关接口会直接返回该错误。
  • 代码配置存在两处明显错误:一是main_resource参数传入个人邮箱地址,客户端凭据流不支持直接指定个人邮箱作为访问资源主体;二是当前使用的应用注册在个人账户所属的Azure AD租户下,和待访问的工作账户OneDrive所属租户不匹配,根本无法获取对应租户的SPO服务授权。
  • 控制台输出Authenticated!仅代表身份认证流程走完、成功拿到了令牌,不代表令牌携带的权限、对应租户的服务许可满足接口调用要求,不能作为接口可正常访问的判断依据。
可行解决方案
  • 优先更换认证流:放弃客户端凭据流,改用委托权限的授权码流认证,直接使用目标工作账户身份完成授权。注意应用需要注册在工作账户所属的Azure AD租户下,注册时给应用添加Files.Read.All、Sites.Read.All等OneDrive访问所需的委托权限,调整后代码参考:
from O365 import Account

# 替换为工作账户租户下注册的应用ID、密钥
credentials = ('替换为实际客户端ID', '替换为实际客户端密钥')
# tenant_id填写工作账户所属的租户ID,移除无效的main_resource参数和credentials认证流配置
account = Account(credentials, tenant_id='工作账户所属租户ID')

if account.authenticate():
    print('Authenticated!')
    storage = account.storage()
    my_drive = storage.get_default_drive() 
    root_folder = my_drive.get_root_folder()

    for item in root_folder.get_items(limit=25):
        if item.is_folder:
            print(list(item.get_items(2)))
  • 若为无人值守场景必须使用客户端凭据流,需满足两个前置条件:
    • 将应用注册到工作账户所属的Azure AD租户下,由租户管理员给应用授予OneDrive/SharePoint对应的应用级权限
    • 联系工作账户所属租户的管理员,确认租户已经购买并激活SharePoint Online服务许可,无有效许可的租户无法调用任何OneDrive for Business接口
  • 移除原代码中无效的main_resource='myemail@email.com'配置,该参数不适用于OneDrive访问场景,会导致令牌受众匹配错误。

内容的提问来源于stack exchange,提问作者tichou

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 10:48:11