我已经找到了一些示例,该示例说明了如何使用passport-azure-ad保护NodeJS中的WebAPI(例如,使用BearerStrategy),但是我还没有找到任何具体在NodeJS中实现OBO流的示例。
在我的情况下,我有一个客户端应用程序,该应用程序在Authorization标头中将承载身份验证令牌发送到我的NodeJS服务。如果我的理解是正确的,那么如果我想让我的NodeJS服务以用户身份调用MS Graph API,则必须在OBO流程中将令牌交换为另一个令牌。
在我发现的使用.NET的服务的示例中,有一个用于此目的的库(您可以调用诸如AcquireTokenAsync之类的东西,并以Bearer令牌作为断言)。如果服务是NodeJS而不是.NET,是否应该使用类似的库?
我知道可以通过发出HTTP requests directly来完成,但我不知道这是否是NodeJS中首选的/唯一的方法。
谢谢!
答案 0 :(得分:1)
实际上,adal-node程序包不支持代流程。为了实现这一点,我们必须进行一个新的HTTP调用并在请求中传递断言。我建议您读取服务中的传入令牌,并通过断言对(https://login.microsoftonline.com/b2bc09c8-9386-47b1-8aexxxxxxxxxx/oauth2/token)端点进行新的http调用,以获取MS Graph API的令牌。
下面是使用邮递员将令牌以代流程发送给用户的屏幕截图。
下面是使用node.js中的代表流获取访问令牌的代码
var qs = require(“ querystring”);
var http = require(“ https”);
var options = {“ method”:“ POST”,“ hostname”:[“ login”,“ microsoftonline”,“ com”],“ path”:[“ b2bc09c8-9386-47xxxxxxxx”,“ oauth2”, “令牌”],“标题”:{“ Content-Type”:“ application / x-www-form-urlencoded”,“ cache-control”:“ no-cache”,“ Postman-Token”:“ 739540c9-1e3d -4d74-bxxxxxxx“}};
var req = http.request(options,function(res){ var chunks = [];
res.on("data", function (chunk) {
chunks.push(chunk);
});
res.on("end", function () {
var body = Buffer.concat(chunks);
console.log(body.toString());
});
});
req.write(qs.stringify({ grant_type:'urn:ietf:params:oauth:grant-type:jwt-bearer', client_id:“ d1538209-a56f-4301-863dxxxxxxxxxxxxx”, 资源:“ https://graph.microsoft.com/”, client_secret:“ NITLQThsHDlPb0FR + 8oXxxxxxxxxxxxxxxxxxxx”, 范围:“ openid”, 断言:“来自本机应用程序的传入访问令牌”, request_token_use:'on_behalf_of', 未定义:未定义 })); req.end();
您可以提取访问令牌并将其用于承载请求中的资源。 我希望这能解决您的问题。