MS Graph示例应用程序集成测试不起作用

时间:2018-10-28 23:20:16

标签: microsoft-graph msal

我想做MS Graph示例节点应用在其integrationTests.js中所做的事情,但是该测试不起作用。这是我尝试过的:

  • 遵循quick start创建一个node.js应用。
  • 运行该应用程序。通过发送电子邮件确保它可以正常工作。
  • 修改了测试检查示例是否可以发送电子邮件以使用我的帐户参数。
  • 试图运行测试。失败并显示403:范围不足。获取令牌的调用返回了作用域,但缺少Mail.Send。
  • 在用于登录login.microsoftonline.com的帖子的数据中,我添加了“作用域:'Mail.Send'”
  • 我仍然收到有效的令牌,并且返回范围包括Mail.Send,但是当我尝试使用该令牌进行发布时,我得到400:无法发布/ beta / me / sendMail
  • 我尝试在查询字符串和标题中添加作用域(Mail.Send)(我在某处看到了),但这没什么区别。
  • 我在应用程序注册门户中为该应用程序添加了Mail.Send许可(在“应用程序许可”下)。
  • 我将测试通话中的令牌(使用https://jwt.ms)与应用程序中的通话进行了比较。我看不出真正的区别。它们都包含Mail.Send范围。

这是代码(与示例中的代码仅略有不同):

// in graphHelper.js
function postSendMail(accessToken, message, callback) {
  request
   .post('https://graph.microsoft.com/beta/me/sendMail')
   //.post('https://graph.microsoft.com/beta/me/sendMail?scope=Mail.Send') // nope
   .send(message)
   .set('Authorization', 'Bearer ' + accessToken)
   .set('Content-Type', 'application/json')
   .set('Content-Length', message.length)
   .set('scope', 'Mail.Send') // nope
   .end((err, res) => {
     callback(err, res);
   });
}

describe('Integration', function () { // mocha
  var accessToken;
  var scope;
  const config = getConfig();

  // My account variables in testConfig.json file
  function getConfig() {
    var configFilePath = path.join(__dirname, 'testConfig.json');
    return JSON.parse(fs.readFileSync(configFilePath, { encoding: 'utf8' }));
  }

  function getAccessToken(done) {
    var postData = querystring.stringify(
      {
        grant_type: 'password',
        //grant_type: 'client_id',  // not supported
        //grant_type: 'authorization_code', // This assumes you've requested an auth code.
        resource: 'https://graph.microsoft.com/',
        scope: 'Mail.Send',
        client_id: config.test_client_id_v2,
        client_secret: config.test_client_secret_v2,
        username: config.test_username,
        password: config.test_password
      }
    );

    var postOptions = {
      host: 'login.microsoftonline.com',
      port: 443,
      path: '/common/oauth2/token',
      method: 'POST',
      headers: {
        'Content-Type': 'application/x-www-form-urlencoded',
        'Content-Length': Buffer.byteLength(postData)
      }
    };

    var postRequest = https.request(postOptions, function (res) {
      var data = '';
      res.setEncoding('utf8');
      res.on('data', function (chunk) {
        data += chunk;
      });
      res.on('end', function () {
        const response = JSON.parse(data);
        accessToken = response.access_token;
        scope = response.scope;
        done();
      });
    });

    postRequest.on('error', function (e) {
      console.log('Error: ' + e.message);
      done(e);
    });

    postRequest.write(postData);
    postRequest.end();
  }

  before( // eslint-disable-line no-undef
    function (done) {
      getAccessToken(done);
    }
  );
  it('Checking that the sample can send an email',
    function (done) {
      var postBody = emailer.generateMailBody(config.test_name, config.test_username);
      graphHelper.postSendMail(
        accessToken, scope,
        JSON.stringify(postBody),
        function (error) {
          assert(error === null, `The sample failed to send an email: ${error}`);
          done();
        });
    }
  );
});

0 个答案:

没有答案