我在Azure Active Directory环境中设置了Native Client Application。我正在尝试编写一个用于实用程序的节点应用程序来与Azure管理API进行交互。我的挑战只是验证我的应用程序。这时,我有:
let azure = {
clientId: '[only-for-my-eyes]',
key: '[only-for-my-eyes]',
tenantDomain: 'mydomain.onmicrosoft.com',
tenantId: '[only-for-my-eyes]'
};
let authenticationRequest = {
url: `https://login.microsoftonline.com/${azure.tenantDomain}/oauth2/v2.0/authorize`,
headers: {
'Content-Type':'application/x-www-form-urlencoded'
},
formData: {
response_type: 'code',
response_mode: 'form_post',
grant_type:'client_credentials',
resource: 'https://management.azure.com',
client_id: azure.clientId,
client_secret: azure.key
}
};
request.post(authenticationRequest, function (error, response, body) {
if (!error && response.statusCode == 200) {
console.log(body);
} else {
console.log(response.statusCode);
console.log(response.statusMessage);
}
});
当上述运行时,执行200状态代码块。但是,它只打印出一堆HTML。如果我正确地看它,它看起来像登录屏幕的HTML。我正在尝试获取一个可以传递给管理API的访问令牌。
我错过了什么?
答案 0 :(得分:0)
我认为特定端点用于具有给定参数的GET,而不是POST。我怀疑你所看到的可能只是一般错误信息:
抱歉,我们在登录时遇到了麻烦。
我们收到了一个错误的请求。
答案 1 :(得分:0)
您要做的是使用POST请求调用授权页面。您不必在此处发送POST(或GET)请求,您必须将用户重定向到该授权网址。
此外,您必须拥有重定向URI(我不会在您的azure
对象中看到它)。此重定向URI是对应用程序的回调。对于我的其余部分,请说它存储在azure.redirectUri
let url = 'https://login.microsoftonline.com/${azure.tenantDomain}/oauth2/v2.0/authorize?response_type=code&response_mode=form_post&client_id={azureclient_id}&resource=https%3A%2F%2Fmanagement.azure.com&redirect_uri={azure.redirectUri}'
response.writeHead(302, {
'Location': url
});
response.end();
用户将被重定向到授权页面,并且必须接受(或拒绝)您的申请请求。然后将用户重定向回Node.js应用程序(azure.redirectUri
)。
由于您的response_mode
为form_post
,如果用户接受了您的申请请求,您将在正文参数中收到授权码。
使用该代码,您的应用程序将能够通过调用令牌端点来获取访问令牌。
答案 2 :(得分:0)
为什么不使用ARMClient?所有令人讨厌的令牌业务都得到了处理。
来自https://www.npmjs.com/package/armclient:
// ES5
var ArmClient = require('armclient');
var client = ArmClient({
subscriptionId: '111111-2222-3333333',
auth: ArmClient.clientCredentials({
tenantId: '444444-555555-666666666',
clientId: '777777-888888-999999999',
clientSecret: 'aaaabbbbbccccc' // or servicePrincipalPassword
})
});
client.get('https://management.azure.com/subscriptions/111-222-333-444/resourceGroups/lab/providers/Microsoft.Automation/automationAccounts', { 'api-version': '2015-10-31' })
.then((res) => {
console.log(res.body);
console.log(res.headers);
})
.catch((err) => {
console.log(err);
});