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
相关产品推荐
相关产品推荐

