- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我最终尝试使用Graph API将数据添加到OneDrive中的Excel文件中,并在PC而非网站上运行本地node.js应用程序,我的目标是在控制台中简单地调用“ node index.js”这,而无需授权我的登录(也许这不可能吗?)
我从这些端点开始首先获取简单数据,但无法使它们工作(基本URL https://graph.microsoft.com):/v1.0/me/
/v1.0/users/{My-UserID}/
/v1.0/me/drive/root:/TestFile.xlsx:/workbook/worksheets
/v1.0/users/{My-UserID}/drive/root:/TestFile.xlsx:/workbook/worksheets
/v1.0/me/
和/v1.0/users/{My-UserID}/
返回'资源\'{My-UserID} \'不存在,或其查询的参考属性对象之一不存在。/v1.0/me/drive/root:/TestFile.xlsx:/workbook/worksheets
和/v1.0/users/{My-UserID}/drive/root:/TestFile.xlsx:/workbook/worksheets
返回“租户没有SPO许可证。”。
我如何获得代币
我使用adal-node库(https://www.npmjs.com/package/adal-node),并使用“通过客户端凭据进行服务器到服务器”流程获得了访问令牌。
我如何调用图形API
我没有使用axios在没有Microsoft Graph SDK的情况下手动调用API。
我如何在Azure门户中注册我的应用程序
我去了“ Azure Active Directory”。
点击“应用注册”。
点击“新注册”。
a)选择一个应用程序名称。
b)在“支持的帐户类型”中选择“仅此组织目录中的帐户(仅默认目录-单租户)”。
c)左侧“重定向URI(可选)”为空
点击“注册”。
复制了“应用程序(客户端)ID”,并将其用作下面我的应用程序中的“客户端ID”常量。
复制了“目录(租户)ID”并将其用作下面我的应用程序中的“租户”常量。
点击“证书和秘密”。
点击“新客户密码”。
a)将“说明”留空。
b)在“过期”下选择“从不”。
c)点击“添加”。
复制生成的机密并将其用作下面我的应用程序中的“ ClientSecret”常量。
点击“ API权限”。
点击“添加权限”。
点击“ Microsoft Graph”。
点击“应用程序权限”。
选中“ Files.Read.All”。
点击“添加权限”。
单击“默认目录的授予管理员同意”,然后单击“是”。
我还尝试添加委派权限,以检查“ Directory.Read.All”和“ Group.Read.All”的所有可用权限和应用程序权限。
我尝试过的
我尝试使用Graph Explorer(https://developer.microsoft.com/en-us/graph/graph-explorer),可以看到两者
/v1.0/me/和/v1.0/me/drive/root:/TestFile.xlsx:/workbook/worksheets返回正确的数据。
我还尝试用/ users / {My-UserID} /替换/ me /,并且Graph Explorer返回相同的正确数据,但是我的node.js应用仍然返回相同的错误。
我使用了JWT解码器来检查检索到的令牌,好像oid
正确等于{My-UserID}。roles
包括“ Files.Read.All”和“ User.Read.All”,这与我在Azure门户中的应用程序注册中设置的一样。appid
正确等于{My-ApplicationID}。tid
正确等于{My-TenantID}。aud
等于'https://graph.microsoft.com'
我还尝试通过使用标头调用POST到https://login.microsoftonline.com/{My-TenantID}/oauth2/v2.0/token来手动获取令牌:'Content-Type': 'application/x-www-form-urlencoded'
和数据:client_id=${My-ClientID}&scope=https%3A%2F%2Fgraph.microsoft.com%2F.default&client_secret={My-ClientSecret}&grant_type=client_credentials
并收到以下错误消息:“ AADSTS7000215:提供了无效的客户端密码”。 <-编辑:我发现了为什么出现此错误。我必须使用%{ascii-in-hex}来转义特殊字符,例如:/ +。
其他注意事项
我有一个Office 365家庭订阅和一个随用随付Azure帐户,该帐户使用与OneDrive相同的电子邮件地址,该电子邮件具有要向其添加数据的Excel文件。
编辑:我发现,如果使用Graph Explorer并调用/v1.0/users/{any-number}
,您将返回自己的配置文件。这意味着{My-UserID}
不可能一直是我正确的用户ID。
const Tenant = {My-TenantID};
const ClientID = {My-ApplicationID};
const ClientSecret = {My-ClientSecret};
function GetAccessToken()
{
const AuthenticationContext = require('adal-node').AuthenticationContext;
const authorityUrl = `https://login.microsoftonline.com/${Tenant}`;
const applicationId = ClientID;
const clientSecret = ClientSecret;
const resource = 'https://graph.microsoft.com';
const context = new AuthenticationContext(authorityUrl);
return new Promise((resolve, reject) =>
{
context.acquireTokenWithClientCredentials(resource, applicationId, clientSecret, (error, tokenResponse) =>
{
if (error)
{
console.log('Get token error:');
console.dir(error.stack, {depth: null});
reject(error);
}
else
{
console.log('Get token success:');
console.dir(tokenResponse, {depth: null});
resolve(tokenResponse.accessToken);
}
});
});
}
async function GetData()
{
const axios = require('axios');
const AccessToken = await GetAccessToken();
axios(
{
method: 'GET',
url: 'https://graph.microsoft.com/v1.0/me/', //I have also tried /v1.0/users/{My-UserID}/
headers:
{
'Authorization': `Bearer ${AccessToken}`,
}
})
.then(result =>
{
console.log('Get data success:');
console.dir(result.data, {depth: null});
})
.catch(error =>
{
console.log('Get data failed:');
if (error.response.data != undefined)
{
console.dir(error.response.data, {depth: null});
}
else
{
console.dir(error, {depth: null});
}
})
}
GetData();
/v1.0/me
或
/v1.0/users/{My-UserID}
无法正常工作。如果我们在没有用户的情况下进行身份验证(我在此处选择的流程),则该应用程序只能访问的用户是Azure Active Directory(AAD)中的用户。现在,如果您使用您的hotmail帐户登录到Azure并转到“ Azure Active Directory”,然后进入“用户”,您将在那里看到您的帐户,但我认为该帐户实际上是与“普通” Microsoft帐户(“普通” 'Microsoft帐户是您通过hotmail注册的帐户)。是的,微软似乎创建了一个单独的“ AAD”身份,这与您的“普通”身份用户不同。
{My-UserID}
实际上是“公共”身份的用户ID。所以..这意味着如果我调用
/v1.0/users/{My-UserID}
,我的应用程序将无法识别该用户ID,因为该用户ID不属于AAD。因此,我尝试的是从AAD中的用户复制“对象ID”,并改为使用:
/v1.0/users/{AAD-ObjectID}
然后是中提琴,我看到了我的个人资料。
{My-UserID}
实际上不是我的“公用”身份的用户ID。这是我不知道的其他ID。
/v1.0/me
和
v1.0/users/{My-UserID}
是否可以正常工作。编辑:无论您指定什么ID,Graph API实际上都会返回我的配置文件,因此您可以指定
v1.0/users/123
,它仍然会返回您的配置文件!
/common/oauth2/v2.0/token
获取访问令牌
/v1.0/me
返回“当前认证的上下文对此请求无效”。
/v1.0/users/{My-UserID}
返回“无法建立调用应用程序的身份”错误。
/v1.0/users/{AAD-ObjectID}
返回“无法建立调用应用程序的身份”错误。
/{My-TenantID}/oauth2/v2.0/token
获取访问令牌,则
/v1.0/me
和
/v1.0/users/{My-UserID}
返回原始的'Request_ResourceNotFound'错误。
/v1.0/users/{AAD-ObjectID}
正确返回我的个人资料。
/v1.0/users/{AAD-ObjectID}/drive/root:/TestFile.xlsx:/workbook/worksheets
,但仍收到“ Tenant没有SPO许可证”。我怀疑这是因为我的AAD身份没有操纵OneDrive项目所需的许可。
/v1.0/users/{My-UserID}
访问我的用户信息并操纵我的使用
/v1.0/users/{My-UserID}/drive
的OneDrive文件。
offline_access
包含到scope参数中,否则当您请求令牌时将不会返回
refreshToken
,并且您将无法刷新令牌。您还需要在应用程序注册中添加
offline_access
委派权限。
refreshToken
并在每次运行时刷新令牌并中提琴,我可以随时编辑Excel文件!
最佳答案
您不能将/me
与客户端凭据一起使用。由于您不对用户进行身份验证,因此Graph无法确定应映射到哪个用户“我”。
使用仅应用程序令牌(即客户端凭据)时,您需要指定要访问的用户:/v1.0/users/{id or userPrincipalName}
/v1.0/{id or userPrincipalName}/drive/root:/TestFile.xlsx:/workbook/worksheets
关于node.js - 解决:调用Microsoft Graph API时,出现了Request_ResourceNotFound,并且租户没有SPO许可证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57560768/
我正在尝试使用 Microsoft Graph API 做一些我认为应该相当简单的事情。 首先,我想做的就是获取我组织中所有用户的列表。 要安装 Microsoft Graph SDK,我按照此处的示
使用适用于 Powershell 的 AzureADPreview (2.0.1.18),我正在尝试向应用程序添加策略: Add-AzureADApplicationPolicy -Id dc1b1
我正在尝试使用 Microsoft Graph API 做一些我认为应该相当简单的事情。 首先,我想做的就是获取我组织中所有用户的列表。 要安装 Microsoft Graph SDK,我按照此处的示
已关闭。此问题需要 debugging details 。目前不接受答案。 编辑问题以包含 desired behavior, a specific problem or error, and the
我是一名优秀的程序员,十分优秀!