有没有一种方法可以使用Passport之类的库在NodeJS中实现Azure AD代理(OBO)流?

时间:2019-03-05 18:21:21

标签: azure-active-directory passport-azure-ad

我已经找到了一些示例,该示例说明了如何使用passport-azure-ad保护NodeJS中的WebAPI(例如,使用BearerStrategy),但是我还没有找到任何具体在NodeJS中实现OBO流的示例。

在我的情况下,我有一个客户端应用程序,该应用程序在Authorization标头中将承载身份验证令牌发送到我的NodeJS服务。如果我的理解是正确的,那么如果我想让我的NodeJS服务以用户身份调用MS Graph API,则必须在OBO流程中将令牌交换为另一个令牌。

在我发现的使用.NET的服务的示例中,有一个用于此目的的库(您可以调用诸如AcquireTokenAsync之类的东西,并以Bearer令牌作为断言)。如果服务是NodeJS而不是.NET,是否应该使用类似的库?

我知道可以通过发出HTTP requests directly来完成,但我不知道这是否是NodeJS中首选的/唯一的方法。

谢谢!

1 个答案:

答案 0 :(得分:1)

实际上,adal-node程序包不支持代流程。为了实现这一点,我们必须进行一个新的HTTP调用并在请求中传递断言。我建议您读取服务中的传入令牌,并通过断言对(https://login.microsoftonline.com/b2bc09c8-9386-47b1-8aexxxxxxxxxx/oauth2/token)端点进行新的http调用,以获取MS Graph API的令牌。

下面是使用邮递员将令牌以代流程发送给用户的屏幕截图。

enter image description here

下面是使用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();

您可以提取访问令牌并将其用于承载请求中的资源。 我希望这能解决您的问题。