租户没有 SPO 许可证

Tenant does not have a SPO license

我在尝试使用 Microsoft Graph 编写脚本以将 Excel 文件上传到 OneDrive 然后读取 Excel 文件时遇到错误。

我按照Microsoft documentation获取了没有用户的访问令牌。我成功获得了访问令牌,但在使用访问令牌调用 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"
        }
    }
}

我不明白为什么我在调用 graph API 时需要有 SPO 许可证以及如何获得它。由于此错误消息,所以我正在尝试购买 SPO 许可证。

根据 this document,我认为我应该在许可页面中看到很多产品,但是在使用 Azure 门户登录并转到许可页面时,我只看到 2 个产品:Azure AD Premium 和 Enterprise Mobility套房:

  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) 并测试 API。

OneDrive for Business 和 Excel API 都需要 Office 365。根据您的屏幕截图,这看起来像是一个独立的 Azure Active Directory 租户(即未链接到 O365)。

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

在这里回答几件事。

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

至于将 Office 365 添加到现有租户。我相信你已经使用 Microsoft 帐户注册了 Azure。这意味着你已经有一个 Azure Active Directory 租户。您仍然可以 purchase/acquire 该租户的 Office 365。您需要做的就是在您的租户中创建一个新的 Azure AD 用户(不是 Microsoft 帐户),并让他们成为公司管理员。然后您应该能够注册 Office 365 - 如果它询问您是否已有租户或帐户,请使用您刚刚创建的 AAD 帐户登录。瞧,你应该有一个订阅了 Azure 的 Azure AD 租户,现在订阅了 Office 365。

希望对您有所帮助,

以防其他人遇到类似问题,我在使用 Office 365 家庭版许可证时收到了相同的错误消息。事实证明,SPO 代表 SharePoint Online,您需要一个 Office 365 商业帐户才能拥有它。据我所知,如果没有 SharePoint(仅附带商业许可证),您将无法使用 Microsoft Graph API 访问 OneDrive。这在我能找到的任何地方都不是很清楚。

如果其他人遇到类似问题,我在使用个人 Microsoft 帐户时收到相同的错误消息,就像 OP 一样。

因此,如果您在注册的 Azure Active Directory (AAD) 应用程序中使用个人帐户,该类型不是 Personal Microsoft accounts onlyAccounts in any organizational directory (Any Azure AD directory - Multitenant) and personal Microsoft accounts (e.g. Skype, Xbox),您将收到此错误。此外,您需要使用正确的端点以避免错误。

主要问题是我们的帐户类型。作为个人帐户,访问一个驱动器文件有一些限制。这些限制是:

  1. 您只能使用 Oauth2 Code FlowOauth2 Token Flow。两者都是交互式方法。 [1][]
  2. 您在 AAD 中注册的应用程序需要 Personal Microsoft accounts onlyAccounts in any organizational directory (Any Azure AD directory - Multitenant) and personal Microsoft accounts (e.g. Skype, Xbox),每个应用程序都有不同的端点来获取访问令牌(您可以看到单击 endpoint 按钮,靠近应用页面中的删除应用按钮)。 []
  3. 为您在 AAD 中注册的应用程序启用这些委派权限:Files.ReadFiles.Read.AllFiles.ReadWriteFiles.ReadWrite.All

考虑到这些限制,您可以按照以下两个步骤在 Postman 中设置工作流(我使用 Personal Microsoft accounts only 应用程序类型的端点并使用 Oauth2 Code Flow):

Important note: To use code flow, you need to enable Access tokens in Implicit grant and hybrid flows on Authentication ADD app sidebar menu.

  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帐户登录并允许该应用程序。您正在通过网络检查获取访问令牌。

  1. 列出一个驱动器的根文件:
https://graph.microsoft.com/v1.0/me/drive/root/children
Add a new header:
Authorization
With value:
Bearer ACCESS_TOKE_OF_STEP_1

在我的 angular 应用程序中,由于这种访问一个驱动器文件的交互方式限制,我将身份验证方法更改为使用 Microsoft Authentication Library(MSAL) 以避免每次需要发送 API 请求打开弹出窗口 window 以验证有效的 Microsoft 帐户。

添加到 answer, you can use this Azure sample以通过MSAL.NET获取令牌。
您唯一需要更改的是 Instance 属性,需要将其设置为:

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