租户没有SPO许可证。

20

我在试图使用Microsoft Graph编写脚本将Excel文件上传到OneDrive,然后读取Excel文件时出现了错误。

我遵循了Microsoft文档获取无用户访问令牌的过程。我成功地得到了一个访问令牌,但是在使用访问令牌调用OneDrive API时出现了错误。

以下是响应内容:

{
    "error": {
        "code": "BadRequest",
        "message": "Tenant does not have a SPO license.",
        "innerError": {
            "request-id": "5ec31d17-3aea-469f-9078-de3608f11d0d",
            "date": "2017-10-10T04:34:05"
        }
    }
}

我不明白为什么在调用图形API时需要拥有SPO许可证以及如何获取它。因为收到了这条错误信息,所以我正在尝试购买SPO许可证。

根据此文档,我认为许可证页面中应该会看到许多产品,但是当我使用Azure门户登录并转到许可证页面时,只看到了2个产品:Azure AD Premium和Enterprise Mobility Suite:

screenshot


与授权问题无关,不属于话题讨论。 - bummi
7个回答

23

如果其他人有类似的问题,当我使用Office 365个人版许可证时,我也遇到了相同的错误消息。结果发现SPO代表SharePoint Online,您需要一个Office 365商业版帐户才能拥有它。据我所知,没有SharePoint(只有商业版许可证才有)是无法使用Microsoft Graph API访问OneDrive的。我无法在任何地方找到这一点非常明确。


2
除了Microsoft Graph API之外,是否还有其他API可以使用Office 365 Home许可证访问OneDrive? - tom
1
我真的不确定,抱歉! - crimson_penguin
1
@crimson_penguin,这份信息部分正确。你可以使用个人账户访问 Graph API,就像我在这里指出的那样。但事实上,如果你是使用商业账户,这份信息是正确的,你需要购买商业许可证。请查看 Graph Explorer https://developer.microsoft.com/en-us/graph/graph-explorer,以了解您的帐户可能性。 - Kikuto

15

在这里回答几个问题。

背景: Microsoft Graph是连接许多Microsoft云服务(例如Office 365、Azure Active Directory、EMS(企业移动套件)、个人Outlook、个人OneDrive等)的开发人员网关或API。使用该API是免费的,但要访问其后面的数据,您需要实际拥有这些服务 - 在某些情况下它们可能是免费的,在其他情况下您可能需要为它们付费。

至于将Office 365添加到现有租户中。我相信您已经使用Microsoft帐户注册了Azure。这意味着您已经拥有一个Azure活动目录租户。您仍然可以为该租户购买/获取Office 365。您需要做的就是在租户中创建一个新的Azure AD用户(而不是Microsoft帐户),并使其成为公司管理员。然后,如果系统询问您是否已经拥有租户或帐户,请使用刚刚创建的AAD帐户登录。然后你就可以注册Office 365了。现在,您应该拥有一个Azure AD租户,并订阅Azure以及Office 365订阅。

希望这可以帮助到您,


{btsdaf} - Dan Kershaw - MSFT
1
这并不能完全帮到你...... OneDrive有一个免费的个人版,而Office365是一种付费订阅。你的意思是说只有购买了Office付费订阅才能使用OneDrive API支持吗?(也就是说它不能与OneDrive个人版一起使用吗?)https://stackoverflow.com/questions/60313963/is-spo-required-for-azure-graph-api-onedrive-api-access-to-read-files-list-an - ina
谢谢,我刚刚使用以下链接注册了新帐户: https://www.microsoft.com/vi-vn/microsoft-365/business/office-365-enterprise-e3-business-software?lc=1066&activetab=pivot:overviewtab 然后使用新的 MSFT 帐户登录 Azure,注册新应用程序并设置 API 权限。 - Trần Trung Hiếu
1
@DanKershaw-MSFT,您能详细解释一下“将其设置为公司管理员”吗? - Lee Han Kyeol
1
我有同样的问题,我正在将文件上传到我的SPO网站,但是我遇到了相同的错误。我想按照您的说明进行修复,但是当您说要在Azure AD中创建一个新用户并将其命名为admin时,我不明白。我已经这样做了,但是想要订阅Office时,电子邮件地址不允许。我创建的新用户的地址类型为: usernew@email_here_admin_of_my_site_azure.onmicrosoft.com这不允许创建O365帐户。 - user5683877
显示剩余4条评论

14

如果其他人遇到类似问题,我在使用个人微软账户时也收到了相同的错误信息,就像原帖作者一样。

所以,如果你正在一个已注册的 Azure Active Directory(AAD)应用程序中使用个人账户,而该类型不是仅限个人微软账户任何组织目录中的帐户(任何 Azure AD 目录 - 多租户)和个人微软账户(例如 Skype、Xbox),你将收到此错误。此外,你需要使用正确的终结点来避免错误。

主要问题是我们的账户类型。作为个人账户,访问 OneDrive 文件有一些限制。这些限制包括:

  1. 您只能使用 Oauth2 Code FlowOauth2 Token Flow。两者都是交互式方法。[1][2]
  2. 您在 AAD 中注册的应用程序需要是 仅限个人Microsoft帐户任何组织目录中的帐户(任意Azure AD目录-多租户)和个人Microsoft帐户(如Skype、Xbox),每个账户有不同的端点来获取访问令牌(您可以点击应用程序页面上的 端点 按钮查看)。[3]
  3. 请为您在 AAD 注册的应用程序启用以下委派权限:Files.ReadFiles.Read.AllFiles.ReadWriteFiles.ReadWrite.All
在考虑到这些限制的情况下,您可以按照以下两个步骤在Postman中设置工作流程(我使用的是“仅限个人Microsoft帐户”应用类型的端点,并使用“Oauth2 Code Flow”):
重要提示:要使用代码流,您需要在身份验证ADD应用程序侧边栏菜单上启用隐式授权和混合流中的访问令牌。
1. 获取访问令牌:
https://login.microsoftonline.com/consumers/oauth2/v2.0/authorize?client_id=YOUR_CLIENT_ID&response_type=token&redirect_uri=ONE_OF_REGISTERED_REDIRECT_URI&scope=Files.Read Files.Read.All Files.ReadWrite Files.ReadWrite.All

在您在Postman的请求中填写信息后,我建议使用浏览器和网络检查来使用Microsoft账户登录并允许该应用程序。您可以通过网络检查获取访问令牌。
2. 列出OneDrive根目录文件:
https://graph.microsoft.com/v1.0/me/drive/root/children
Add a new header:
Authorization
With value:
Bearer ACCESS_TOKE_OF_STEP_1

在我的Angular应用程序中,由于这种交互方式限制了对OneDrive文件的访问,我改变了我的身份验证方法,使用Microsoft Authentication Library(MSAL)来避免每次需要发送API请求时打开一个弹出窗口来验证有效的Microsoft账户。

1
这将适用于用户可以从浏览器登录的情况。如果我们想使用client_credential流或资源所有者流获取令牌,该怎么办? - Lenzman
4
@JeffinJ,如我在限制1中所述。对于个人账户,您只能使用Oauth2 Code Flow或Oauth2 Token Flow,并且两种方法都是交互式的。您只能在业务账户中使用client_credential流程或资源所有者流程。我的第一次尝试是使用client_credential流程,然后我发现了限制并将我的整个架构更改为交互式方法,正如我在答案结尾所说的那样。 - Kikuto
你听说过rclone吗?它可以无缝地绕过用户交互。 - Lenzman
@JeffinJ 如果你在谈论这个 https://rclone.org/onedrive/,看起来是一个不错的选择!我之前不知道这个选项。但现在对我来说已经太晚了。 - Kikuto
1
如果您只需要将文件从服务器同步到OneDrive,或者将服务器用作临时空间存储文件,然后上传文件到OneDrive,则rclone是一个不错的选择。rclone会自动处理其他所有事情。 - Lenzman

4

OneDrive企业版和Excel API都需要使用Office 365。根据您的截图,这似乎是一个独立的Azure Active Directory租户(即未链接到O365)。

SPO许可证消息出现的原因是OneDrive企业版是一个特殊的SharePoint Online文档库,会自动为用户配置。


谢谢你的帮助。如果我购买Office 365,你的意思是我可以使用OneDrive和Excel API吗?我的Microsoft账户似乎无法购买Office 365,它似乎只适用于工作账户。如果我注册一个工作账户并购买Office 365,我该如何将其链接到我的现有Azure Active Directory租户? - Ken Pham
你可以使用这些API与你的Microsoft账户配合使用,但是你需要使用v2 Endpoint。你在应用注册时使用的是v1,它只支持工作/学校账户。 - Marc LaFleur
1
您可以使用服务到服务(也称为客户端凭据流)与个人(MSA)帐户。您可以将其与工作/学校(AAD)租户一起使用。这是因为您的个人OneDrive是公共租户的一部分,而OneDrive for Business是私有订阅的一部分。您需要一个商业O365租户才能使用此功能。 - Marc LaFleur
@Marc LaFleur 我也遇到了类似的问题。我的应用程序使用后端API服务(没有用户),应该与我的个人OneDrive进行交互。我已在应用注册门户中注册了应用程序。当我尝试通过向https://login.microsoftonline.com/common/adminconsent?client_id=&redirect_uri=发送请求来获取adminconstent时,我收到了“我们无法从此api版本发出令牌”的消息。我尝试使用AzureAD。在那里注册了我的应用程序。我能够获得访问令牌。但是查询Graph API返回“租户没有SPO许可证”。请告诉我我该怎么办。谢谢! - Sparrow_ua
2
如上所述,您不能在个人帐户中使用客户端凭据/仅应用程序。 - Marc LaFleur
显示剩余4条评论

3
  1. 请问您是否能够在同一租户中使用账户登录后,通过浏览器手动访问OneDrive内容(包括Excel文件)?

  2. 如果您可以手动访问驱动器和文件,请使用Graph Explorer https://developer.microsoft.com/en-us/graph/graph-explorer 以相同的帐户登录并发出获取驱动器内容的调用。当您登录时,系统会提示您授权页面,列出需要授权的权限。请记录这些权限并检查它们是否与访问驱动器所需的权限匹配。

  3. 如果您还没有适当的SPO许可证,您可以尝试设置一个免费的Office-365试用帐户 (https://products.office.com/en-in/business/office-365-enterprise-e3-business-software) 并测试APIs。


  1. 我能够访问Onedrive网站,上传一个Excel文件并读取它。
  2. 我能够使用Graph Explore访问我的根目录,并且我可以在API的响应中看到已上传的文件。但是,我无法通过Excel API读取该文件。我收到了这个错误:{"code": "generalException", "message": " Exception While Processing"}
- Ken Pham
1
我无法使用Microsoft帐户设置Office-365。看起来我需要一个工作帐户才能按照您的建议操作。但是,如果我设置了一个工作帐户,我该如何将此帐户链接到我的现有租户? - Ken Pham

1

对于像我这样的人,只是尝试使用 .Net 的 MS GRAPH SDK 并在尝试访问他们的个人驱动器时遇到此错误的人。

首先,请确保在注册应用程序时选择 仅限个人 Microsoft 帐户

其次,TenantId 应设置为 consumers。例如:

    var deviceCodeCredentialOptions = new DeviceCodeCredentialOptions()
    {
        ClientId = ApplicationClientId,
        TenantId = "consumers",
        DeviceCodeCallback = (info, cancle) =>
        {
            // Display the device code message to
            // the user. This tells them
            // where to go to sign in and provides the
            // code to use.
            Console.WriteLine(info.Message);
            return Task.FromResult(0);
        },
        TokenCachePersistenceOptions = new TokenCachePersistenceOptions() {Name = TokenName}
    };

此外,请确保您的作用域具有适当的权限,例如Files.ReadWrite
之后,您应该能够无问题地访问您的驱动器。

1

补充Kikutos' answer的答案,您可以使用this Azure sample通过MSAL.NET获取令牌。
您唯一需要更改的是Instance属性,它需要设置为:

https://login.microsoftonline.com/consumers/

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接