使用Azure通过Azure AD进行身份验证

时间:2016-07-29 18:40:49

标签: azure oauth-2.0 azure-active-directory

我在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的访问令牌。

我错过了什么?

3 个答案:

答案 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_modeform_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);
  });