【问题标题】:Microsoft Graph permission scopes throwing error when I pass more than one scope当我通过多个范围时,Microsoft Graph 权限范围抛出错误
【发布时间】:2021-12-30 00:36:24
【问题描述】:

我需要以编程方式将文件上传到 OneDrive。我没有前端来生成密钥,因为我需要在没有用户交互的情况下生成它们,这就是我的问题。我已经用一个简单的 POC 做到了这一点,但它必然需要用户交互,因为它使用登录名和密码凭据对 Microsoft 帐户进行身份验证,然后才使用 clientId 和 clientSecret

当我尝试使用 @msal-node 生成令牌时,它不使用 Azure 中定义的范围。

const msal = require('@azure/msal-node')
const config = require('../config')
const azConfig = {
  auth: {
    clientId: config.azureAppId,
    authority: `https://login.microsoftonline.com/${config.azureTenantId}`,
    clientSecret: config.azureAuthSecret
  }
}

const pca = new msal.ConfidentialClientApplication(azConfig)

return await pca.acquireTokenByClientCredential({
  scopes: [`${config.azureAppId}/.default`]
})

而且我也无法通过 acquireTokenByClientCredential() 函数传递新范围,因为它引发了错误。

const msal = require('@azure/msal-node')
const config = require('../config')
const azConfig = {
  auth: {
    clientId: config.azureAppId,
    authority: `https://login.microsoftonline.com/${config.azureTenantId}`,
    clientSecret: config.azureAuthSecret
  }
}

const pca = new msal.ConfidentialClientApplication(azConfig)

return await pca.acquireTokenByClientCredential({
  scopes: [
    `${config.azureAppId}/.default`,
    'Files.Read'
  ]
})

ServerError: invalid_scope: 70011 - [2021-12-30 01:02:11Z]: AADSTS70011: The provided request must include a 'scope' input parameter. The provided value for the input parameter 'scope' is not valid. The scope api://<azureAppId>/.default Files.Read openid profile offline_access is not valid.

该函数唯一支持的作用域是/.default,它不使用Azure中添加的权限,当我尝试将作用域添加到函数代码中时,它返回一个错误,指出scopes参数无效.

但是当我使用具有相同凭据的 Postman 生成令牌时,它会起作用并添加我需要访问 OneDrive 的范围

【问题讨论】:

    标签: node.js azure onedrive msal


    【解决方案1】:

    很难确切地说出如何解决您的问题。我们不知道获取该令牌的目的是什么 - Azure 正在使用身份验证和访问令牌的组合。鉴于您正在定义“Files.Read”范围,您可能旨在授权用户。

    调查后:

    https://github.com/AzureAD/microsoft-authentication-library-for-js/blob/2c58d3ff42a04052e16758f5496a30e76b4c39b2/lib/msal-common/docs/request.md

    和个人经验,我建议你尝试以下:

    1. 阐明代币的目的以及实现该目的的最佳地点(FE/BE)。例如,当用户登录或授权请求到您的后端时,最佳实践是使用前端的 msal 库(在那里获取身份验证令牌)并将您的后端隐藏在 API 管理服务后面,并配置其策略以授权基于访问令牌的请求 - 也在前端生成。

    2. 确保您的应用程序 (Web API) 已在 Active Directory 中注册。 Azure 文档从此处开始:https://docs.microsoft.com/en-us/azure/active-directory/develop/quickstart-create-new-tenant

    3. 为您的注册添加相关范围:https://docs.microsoft.com/en-us/azure/active-directory/develop/quickstart-configure-app-expose-web-apis

    4. 在您的代码中,首先为您的范围使用单个值,例如Mail.Read 并在尝试多个范围之前先对其进行测试(即获取令牌)。

    【讨论】:

    • 对不起,我还没有真正弄清楚令牌的用途是什么。我将编辑帖子以明确这一点,但在这里:我需要以编程方式将文件上传到 OneDrive。我没有前端来生成密钥,因为我需要在没有用户交互的情况下生成它们,这就是我的问题。我已经设法用一个简单的 POC 做到了这一点,但它必然需要用户交互,因为它使用登录名和密码凭据来验证 Microsoft 帐户,然后才使用 clientIdclientSecret
    • @cSaller 您能否描述一下您的 POC 流程和整体解决方案?您是否希望将文件上传到特定用户的 OneDrive 并且您需要授权您的后端来执行此操作或 OneDrive 并且您需要在访问它时进行身份验证?或者也许还有另一种选择?
    • 我使用this tutorial 生成承载令牌,之后我能够通过 API 访问所有 OneDrive 功能。我特别需要的是通过 API 将本地文件上传到我的 OneDrive 帐户,因为这将有助于自动化我正在为个人项目开发的备份工具。
    • 根据您在此处的评论添加了第二个答案。
    【解决方案2】:

    不幸的是,我没有以编程方式使用 OneDrive 的经验,但无论如何我已经对此进行了一些研究。

    根据MS documentation 'Files.Read' 是一个有效范围。

    您正在开发的应用程序被 MS 称为守护程序、服务帐户或后端服务(感谢 MS 让我们的生活变得简单)。换句话说,它是一个服务器应用程序,它希望在没有用户交互的情况下通过 Azure 进行身份验证。请参阅此diagram 以供参考。

    将您的代码组织成函数或类,以避免在函数/方法体之外使用 return 语句。

    请参阅此example 以调用 MS Graph API 来验证和授权您的应用程序。这应该允许您获取访问令牌。

    一旦您能够获得令牌,请参阅此walkthrough of OneDrive REST API,了解有关如何以编程方式访问它并与之交互的详细信息。

    PS 关于使用 MS Azure 文档的一般建议:不要指望找到一个页面,该页面可以为您提供您想要实现的目标的确切方法(尽管有时您可能很幸运)。 Azure 太大了。尝试对需要执行的步骤有一个高层次的理解——图表通常很有帮助。然后,只需四处寻找针对您的特定用例的每个步骤的页面。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-07-26
      • 1970-01-01
      • 2016-11-04
      • 1970-01-01
      • 1970-01-01
      • 2018-08-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多