我正在尝试编写一个调用Microsoft Graph API的简单Azure函数。但是我无法使access_token工作。这是我所做的:
npm install request
) var request = require('request');
module.exports = function (context, req) {
var token = req.headers['x-ms-token-aad-access-token'];
var reqUrl = 'https://graph.microsoft.com/v1.0/me/';
request.get(reqUrl, {'auth': {'bearer': token}}, function (err, response, msg) {
context.res = {
body: msg
};
context.done();
});
};
在单独的浏览器窗口中测试了此功能。正确登录AAD。
但是从Graph返回的消息是:
"{
"error": {
"code": "InvalidAuthenticationToken",
"message": "CompactToken parsing failed with error code: -2147184105",
"innerError": {
"request-id": "4c78551d-f0fe-4104-b1d3-e2d96fd3c02c",
"date": "2017-05-16T19:11:14"
}
}
}"
我调查了从中获得的令牌req.headers['x-ms-token-aad-access-token']
。类似于“ AQABAA
....”,它似乎与我之前见过的以“ eyJ ....”开头的常规access_token不同。
这有什么问题吗?调用Graph API时,是否应该使用请求标头中的access_token?
谢谢!
根据克里斯·吉伦(Chris
Gillum)的建议,我还研究了“代收”流程。这是我更新的函数,它通过提供id_token(从请求标头中检索)来获取特定资源(在我的情况下为https://graph.microsoft.com)的access_token
。
var request = require('request');
module.exports = function (context, req) {
var parameters = {
grant_type: 'urn:ietf:params:oauth:grant-type:jwt-bearer',
client_id: process.env.WEBSITE_AUTH_CLIENT_ID,
client_secret: process.env.WEBSITE_AUTH_CLIENT_SECRET,
assertion: req.headers['x-ms-token-aad-id-token'],
resource: 'https://graph.microsoft.com',
requested_token_use: 'on_behalf_of'
};
request.post('https://login.microsoftonline.com/microsoft.com/oauth2/token', {form: parameters}, function (aadErr, aadResponse, aadMsg) {
var msgJson = JSON.parse(aadMsg);
request.get('https://graph.microsoft.com/v1.0/me/', {'auth': {'bearer': msgJson.access_token}}, function (err, response, msg) {
context.res = {
body: msg
};
context.done();
});
});
};
使用Azure App Service身份验证/授权时,有两种方法可以使此项工作:
x-ms-token-aad-id-token
)交换为MS Graph访问令牌。不需要任何代码更改的最简单方法是执行#1。我在我的App Service Auth和Azure AD Graph
API
博客文章(需要一些更新)中概述了该过程,但是在这里我将为您提供Microsoft Graph的经过功能优化的版本。
您需要做的主要事情是:
"additionalLoginParams"
从更改null
为["resource=https://graph.microsoft.com"]
,然后保存更改。完成此操作并再次登录后,x-ms-token-aad-access-token
请求标头将始终为您提供与Microsoft Graph一起使用的访问令牌。
上述方法的缺点是,如果您需要从功能应用程序访问多个受AAD保护的资源,那么它无济于事。如果这对您来说是个问题,那么您将需要使用上面的方法2。
我正在使用Azure函数V1 c#。我有一个时间触发的azure函数,它每秒都在检查我的数据库中的一些数据。如果找到了数据,我想对它执行一些操作。此操作可能需要30秒到5分钟的时间,具体取决于其上发生的操作。 > 当我的时间触发函数获取数据并开始对其执行操作时。在第一个操作完成之前,时间触发的函数不会再次执行。因此,即使时间触发函数被安排为每秒执行一次,如果上一次迭代中的操作花费了 30 秒,则在
在过去的几个小时里,我一直在调试、配置和命名它,我似乎不明白为什么会发生这种情况。 我正在尝试调用一个 lambda 函数,该函数只是从 ec2 中检索基本信息。当我在aws控制台中测试此lambda函数时,它似乎工作正常。但是,使用以下代码在另一个lambda中调用它; 它只是超时了。没有任何反应…两个Lambda都连接到VPC和所有子网 我认为是我的新VPC导致了这个问题。我的VPC包括: 1
简而言之:我想创建一个类型为的泛型类,它应该调用一个类型为的具体化内联函数,以便能够更通用地使用Gson 但是我希望我的其他类通过某个类实例调用这个函数。例如,类似于应该返回列表,而不是直接调用。我如何实现这样的功能?
我在班里学习。出于好奇,我扩展了具有参数化构造函数的内部类。但是当我编写super(inti)来调用它时,代码不会编译。 因为内部类是外部类的一部分(成员),必须通过外部类访问它们。如何调用测试类的超级构造函数。 编译错误是:由于某些中间构造函数调用,没有外部类型的封闭实例可用
问题内容: 我有一些代码,其结构类似于此 问题是它向我吐了一个错误。 解析错误:语法错误,意外的T_LNUMBER,预期的T_VARIABLE或’$’ 有关于如何在bbcode函数的preg_replace内调用embed_video的想法吗? 谢谢! 问题答案: 您可以在上使用“ e”修饰符(请参见模式修饰符) 告诉将第二个参数视为PHP代码。
例外情况。kt: 在科特林: 它在kotlin中工作,函数是内联的。 但是当在Java代码中使用时,它就是不能内联,仍然是一个正常的静态方法调用(从反编译的内容中可以看出)。 像这样的东西: