问题描述
我需要什么:
我需要使用Microsoft Graph API从Microsoft Teams Channel中读取一个excel表。
使用以下URI是可能的:
https://graph.microsoft.com/v1.0/drives/someId/items/someId/workbook/tables/tableName/rows
问题在于,此端点需要有效的令牌。
有 2个机会:
-
创建可以访问整个OneDrive的Azure AD应用程序。
-
创建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”。
有什么想法吗?谢谢
解决方法
对于此问题,您需要了解ConfidentialClientApplication
和PublicClientApplication
之间的区别。
请参阅Public Client and Confidential Client applications。
公共客户端应用程序是在设备(例如电话)或台式计算机上运行的应用程序。他们不信任 安全地保留应用程序的机密,因此可以访问 仅用户名(它们仅支持公共客户端流)。上市 客户端无法保存配置时间秘密,因此 没有客户机密。
因此对于PublicClientApplication
,我们不需要客户密码。
您需要做的(是您在comment中找到的):
在应用程序菜单栏中,选择清单,然后在清单编辑器中,将allowPublicClient
属性设置为true
。
有一个完整的示例,其中包含详细的步骤here,供您参考。
此外,由于您试图读取excel表,因此user.read
权限还不够。
基于List rows Permissions,您需要在Azure AD应用程序中添加Files.ReadWrite
委派权限(应用程序注册)。并且您还应该在代码中指定它。
我已完成所有步骤,以使其起作用:
-
我需要访问一个共享文件夹,因此需要在代码中将范围更改为“ Files.ReadWrite.All”。
-
在应用程序的页面列表中,选择API权限,单击“添加权限”按钮,然后确保选择了“ Microsoft API”选项卡。在“常用的Microsoft API”部分中,单击“ Microsoft Graph”。在“委派的权限”部分,确保选中了正确的权限:Files.ReadWrite.All。如有必要,请使用搜索框。选择添加权限按钮。
-
在应用程序的页面列表中,选择“清单”,然后在清单编辑器中,将allowPublicClient属性设置为true,在清单编辑器上方的栏中选择“保存”。
-
以租户管理员身份登录https://portal.azure.com。打开您的应用程序的注册。转到设置,然后进入必需的权限。按“授予权限”按钮。