如何获取 Microsoft Graph 的令牌以读取 excel table?
How can I get a token for Microsoft Graph to read an excel table?
我需要:
我需要使用 Microsoft Graph API 从 Microsoft Teams 频道读取 excel table。
这可以通过以下 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: The request body must contain the following parameter: 'client_assertion' or 'client_secret'.
有什么想法吗?谢谢
对于这个问题,你需要了解一下ConfidentialClientApplication
和PublicClientApplication
的区别。
请参阅Public Client and Confidential Client applications。
Public client applications are applications which run on devices (phones for instance) or desktop machines. They are not trusted to
safely keep application secrets, and therefore access Web APIs in the
name of the user only (they only support public client flows). Public
clients are unable to hold configuration time secrets, and as a result
have no client secret.
所以对于 PublicClientApplication
,我们不需要客户端密码。
你需要做的是(你从这个comment中找到的):
在 Application 菜单 blade、select Manifest 和清单编辑器中,设置allowPublicClient
属性 到 true
.
有详细步骤的完整示例here供您参考。
此外,由于您正在尝试读取 excel table,因此 user.read
权限不够。
基于List rows Permissions,需要在Azure AD应用中添加Files.ReadWrite
委托权限(应用注册)。你也应该在你的代码中指定它。
我完成的所有步骤:
我需要访问一个共享文件夹,所以我需要在我的代码中将范围更改为“Files.ReadWrite.All”。
在应用的页面列表中,select API 权限,单击添加权限按钮,然后确保 Microsoft APIs选项卡已 selected。在常用的 Microsoft APIs 部分,单击 Microsoft Graph。在委派权限部分,确保选中正确的权限:Files.ReadWrite.All。如有必要,请使用搜索框。 Select 添加权限按钮。
在应用程序的页面列表中,select Manifest,并在清单编辑器中,将 allowPublicClient 属性 设置为 true,select 保存在清单编辑器上方的栏。
以租户管理员身份登录 https://portal.azure.com。打开您的应用程序的注册。转到设置,然后是所需的权限。按授予权限按钮。
我需要:
我需要使用 Microsoft Graph API 从 Microsoft Teams 频道读取 excel table。
这可以通过以下 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: The request body must contain the following parameter: 'client_assertion' or 'client_secret'.
有什么想法吗?谢谢
对于这个问题,你需要了解一下ConfidentialClientApplication
和PublicClientApplication
的区别。
请参阅Public Client and Confidential Client applications。
Public client applications are applications which run on devices (phones for instance) or desktop machines. They are not trusted to safely keep application secrets, and therefore access Web APIs in the name of the user only (they only support public client flows). Public clients are unable to hold configuration time secrets, and as a result have no client secret.
所以对于 PublicClientApplication
,我们不需要客户端密码。
你需要做的是(你从这个comment中找到的):
在 Application 菜单 blade、select Manifest 和清单编辑器中,设置allowPublicClient
属性 到 true
.
有详细步骤的完整示例here供您参考。
此外,由于您正在尝试读取 excel table,因此 user.read
权限不够。
基于List rows Permissions,需要在Azure AD应用中添加Files.ReadWrite
委托权限(应用注册)。你也应该在你的代码中指定它。
我完成的所有步骤:
我需要访问一个共享文件夹,所以我需要在我的代码中将范围更改为“Files.ReadWrite.All”。
在应用的页面列表中,select API 权限,单击添加权限按钮,然后确保 Microsoft APIs选项卡已 selected。在常用的 Microsoft APIs 部分,单击 Microsoft Graph。在委派权限部分,确保选中正确的权限:Files.ReadWrite.All。如有必要,请使用搜索框。 Select 添加权限按钮。
在应用程序的页面列表中,select Manifest,并在清单编辑器中,将 allowPublicClient 属性 设置为 true,select 保存在清单编辑器上方的栏。
以租户管理员身份登录 https://portal.azure.com。打开您的应用程序的注册。转到设置,然后是所需的权限。按授予权限按钮。