如何获得Microsoft Graph读取excel表的令牌?

问题描述

我需要什么: 我需要使用Microsoft Graph API从Microsoft Teams Channel中读取一个excel表。
使用以下URI是可能的:

https://graph.microsoft.com/v1.0/drives/someId/items/someId/workbook/tables/tableName/rows

问题在于,此端点需要有效的令牌。

2个机会

  1. 创建可以访问整个OneDrive的Azure AD应用程序。

  2. 创建Azure AD应用程序以检索有权访问所需文件的服务用户的令牌。

第一个问题是,我不想让它访问整个OneDrive。我希望它只能访问一个OneDrive文件夹。 也许可以将访问权限限制为仅一个OneDrive文件夹吗?

我已经使用com.microsoft.aad.msal4j库尝试了第二种替代方法

        String APP_ID = "20106bdc-eec0-493d-b32f-526583aa95a6";
        String AUTHORITY = "https://login.microsoftonline.com/112121a0-cc1f-12af-1213-faaa12ef1b11/v2.0";
        PublicClientApplication pca = PublicClientApplication.builder(
                APP_ID).
                authority(AUTHORITY).build();

        String scopes = "User.Read";
        UserNamePasswordParameters parameters = UserNamePasswordParameters.builder(
                Collections.singleton(scopes),userName,password.toCharArray()).build();

        IAuthenticationResult result = pca.acquireToken(parameters).get();

但这会导致以下异常:

com.microsoft.aad.msal4j.MsalServiceException:AADSTS7000218:请求正文必须包含以下参数:“ client_assertion”或“ client_secret”。

有什么想法吗?谢谢

解决方法

对于此问题,您需要了解ConfidentialClientApplicationPublicClientApplication之间的区别。

请参阅Public Client and Confidential Client applications

公共客户端应用程序是在设备(例如电话)或台式计算机上运行的应用程序。他们不信任 安全地保留应用程序的机密,因此可以访问 仅用户名(它们仅支持公共客户端流)。上市 客户端无法保存配置时间秘密,因此 没有客户机密。

因此对于PublicClientApplication,我们不需要客户密码。

您需要做的(是您在comment中找到的):

应用程序菜单栏中,选择清单,然后在清单编辑器中,将allowPublicClient属性设置为true

有一个完整的示例,其中包含详细的步骤here,供您参考。

此外,由于您试图读取excel表,因此user.read权限还不够。

基于List rows Permissions,您需要在Azure AD应用程序中添加Files.ReadWrite委派权限(应用程序注册)。并且您还应该在代码中指定它。

,

我已完成所有步骤,以使其起作用:

  1. 我需要访问一个共享文件夹,因此需要在代码中将范围更改为“ Files.ReadWrite.All”。

  2. 在应用程序的页面列表中,选择API权限,单击“添加权限”按钮,然后确保选择了“ Microsoft API”选项卡。在“常用的Microsoft API”部分中,单击“ Microsoft Graph”。在“委派的权限”部分,确保选中了正确的权限:Files.ReadWrite.All。如有必要,请使用搜索框。选择添加权限按钮。

  3. 在应用程序的页面列表中,选择“清单”,然后在清单编辑器中,将allowPublicClient属性设置为true,在清单编辑器上方的栏中选择“保存”。

  4. 以租户管理员身份登录https://portal.azure.com。打开您的应用程序的注册。转到设置,然后进入必需的权限。按“授予权限”按钮。

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...