我想使用此库与我的AD的图API进行互动 - https://github.com/microsoftgraph/microsoft-graph-docs/blob/master/concepts/nodejs.md
但是,我发现所有返回访问令牌的现有javascript库都希望传入返回URL,以及其他一些特定于Web的内容,这让我相信这是某种要求在微软的结束。
在运行后端节点脚本时没有任何好的方法来验证/接收访问令牌(没有任何与Web相关的),以便我可以开始对Microsoft Graph API进行调用吗?提前感谢您的建议。
答案 0 :(得分:4)
要运行连接到Graph API的未经用户身份验证的后端守护程序,您要使用仅应用程序身份验证流程。以下是the official steps的快速摘要:
yourtenant.onmicrosoft.com
名称,然后将此值复制下来。Azure Active Directory
刀片服务器的App Registrations
部分(而不是直接在租户属性中)注册应用程序。复制Application ID
;我们以后再用。Save
,然后单击Grant Permissions
按钮。login.microsoftonline.com
域发出HTTP请求以获取访问令牌。 Here's a link to Microsofts Node.js example,这是指向HTTP调用上的direct documentation的链接,用于检索访问令牌。这是一个超级精简的示例,将输出检索到的访问令牌。替换[Tenant]
,[ApplicationID]
和[Key]
的值:
const request = require("request");
const endpoint = "https://login.microsoftonline.com/[Tenant].onmicrosoft.com/oauth2/token";
const requestParams = {
grant_type: "client_credentials",
client_id: "[ApplicationID]",
client_secret: "[Key]",
resource: "https://graph.windows.net"
};
request.post({ url:endpoint, form: requestParams }, function (err, response, body) {
if (err) {
console.log("error");
}
else {
console.log("Body=" + body);
let parsedBody = JSON.parse(body);
if (parsedBody.error_description) {
console.log("Error=" + parsedBody.error_description);
}
else {
console.log("Access Token=" + parsedBody.access_token);
}
}
});
一旦有了access_token,我们就可以调用Graph API。假设正确配置了应用程序权限并从第4步开始应用,我们可以开始发出Graph API请求:
function testGraphAPI(accessToken) {
request.get({
url:"https://graph.windows.net/[Tenant]/users?api-version=1.6",
headers: {
"Authorization": accessToken
}
}, function(err, response, body) {
console.log(body);
});
}
答案 1 :(得分:1)
BU0的答案对我来说无法正常工作,因为Microsoft更改了使用图形API的方式,因此我无法获取所需的所有数据。这是我使用BU0答案和此tutorial进行的操作:
const request = require("request");
const endpoint = "https://login.microsoftonline.com/[Tenant]/oauth2/v2.0/token";
const requestParams = {
grant_type: "client_credentials",
client_id: "[ApplicationID]",
client_secret: "[Key]",
scope: "https://graph.microsoft.com/.default"
};
request.post({ url:endpoint, form: requestParams }, function (err, response, body) {
if (err) {
console.log("error");
}
else {
console.log("Body=" + body);
let parsedBody = JSON.parse(body);
if (parsedBody.error_description) {
console.log("Error=" + parsedBody.error_description);
}
else {
console.log("Access Token=" + parsedBody.access_token);
}
}
});
function testGraphAPI(accessToken) {
request.get({
url:"https://graph.microsoft.com/v1.0/users",
headers: {
"Authorization": "Bearer " + accessToken
}
}, function(err, response, body) {
console.log(body);
});
}
答案 2 :(得分:0)
在const端点使用url字符串时,我遇到了一些问题
https://login.microsoftonline.com/[Tenant]/oauth2/v2.0/token
相反,我以这种方式从Microsoft graph api docs中通过了租户:
https://login.microsoftonline.com/{tenant}/oauth2/v2.0/authorize
答案 3 :(得分:0)
另一种方式:
'use strict';
const axios = require('axios');
const qs = require('qs');
const accessTokenWithCredentials = (tenantId, clientId, clientSecret, resource) => {
const data = {
resource: resource,
grant_type: 'client_credentials',
};
return axios({
url: `https://login.windows.net/${tenantId}/oauth2/token`,
method: "post",
headers: { 'content-type': 'application/x-www-form-urlencoded' },
auth: {
username: clientId,
password: clientSecret,
},
data: qs.stringify(data)
}).catch(error => {
throw error;
})
};
调用函数:
accessTokenWithCredentials(<tenantId>, <clientId>, <clientSecret>, 'https://graph.microsoft.com').then(response => {
console.log(`Got access token`);
const token = JSON.stringify(response.data.access_token);
// do what you need to do
}).catch(err => {
console.log("err " + err);
throw err;
});