Как получить токен Microsoft Graph API Access из Node Script?
Я хотел бы использовать эту библиотеку для взаимодействия с API графа для моей AD - https://github.com/microsoftgraph/microsoft-graph-docs/blob/master/concepts/nodejs.md
Тем не менее, все существующие библиотеки javascript, которые я обнаружил, чтобы возвращать токены доступа, ожидают передачи URL-адреса возврата, а также некоторые другие специфичные для сети вещи, что позволяет мне полагать, что это своего рода требование со стороны Microsoft.
Есть ли какой-нибудь хороший способ для аутентификации / получения токена доступа во время выполнения сценария бэкэнд-узла (не связанного с веб-интерфейсом), чтобы я мог начать делать вызовы Microsoft Graph API? Заранее спасибо за совет.
4 ответа
Для запуска внутреннего демона без аутентификации пользователя, подключенного к Graph API, вы хотите использовать поток аутентификации только для приложения. Вот краткое изложение официальных шагов:
- Создайте своего Azure AD Tenant. Обратите внимание
yourtenant.onmicrosoft.com
имя, и скопируйте это значение вниз. - Зарегистрируйте заявку через глобальный
Azure Active Directory
клинкаApp Registrations
раздел, а не непосредственно в свойствах арендатора. СкопируйтеApplication ID
; это понадобится нам позже. - Создайте ключ, связанный с регистрацией, и не забудьте скопировать его. После того, как вы щелкнете мышью, вы не сможете вернуть значение ключа, поэтому обязательно скопируйте его.
- Также обновите разрешения регистрации до того, что вам нужно, нажмите
Save
, а затем также ударилGrant Permissions
кнопка. - Сделайте HTTP-запрос к
login.microsoftonline.com
домен для получения токена доступа. - Используйте токен доступа для выполнения запросов API Graph.
Вот ссылка на пример Microsofts Node.js, а также ссылка на прямую документацию по HTTP-вызову для получения токена доступа. А вот супер урезанный пример, который выведет полученный токен доступа. Заменить [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, мы можем вызвать API Graph. Предполагая, что права доступа к приложениям были настроены правильно и применены с шага № 4, мы можем начать делать запросы к API Graph:
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);
});
}
BU0 не сработал для меня правильно, потому что Microsoft изменила способ использования графического API, поэтому я не смог получить все необходимые данные. Вот как я это сделал, используя ответ BU0 и этот урок:
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);
});
}
Другой путь:
'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;
});
У меня возникла проблема с использованием строки URL-адреса для конечной точки const
https://login.microsoftonline.com/[Tenant]/oauth2/v2.0/token
Вместо этого я передал арендатора таким образом, а не из документации Microsoft graph api:
https://login.microsoftonline.com/{tenant}/oauth2/v2.0/authorize
Ссылка из документации -> Запросить код авторизации