Тест интеграции приложения для примера MS Graph не работает - PullRequest
0 голосов
/ 29 октября 2018

Я хочу сделать то же, что и приложение-образец узла MS Graph в своем integrationTests.js, но этот тест не работает. Вот что я попробовал:

  • После быстрого запуска было создано приложение node.js.
  • Запустил приложение. Убедитесь, что это сработало, отправив электронное письмо.
  • Изменен тест Проверка того, что образец может отправить электронное письмо для использования параметров моей учетной записи.
  • Пытался запустить тест. Ошибка 403: недостаточный объем. Вызов для получения токена вернул границы, но не хватило Mail.Send.
  • В почтовых данных для звонка на login.microsoftonline.com я добавил "scope: 'Mail.Send'"
  • Я все еще получаю действительный токен, и область возврата включает Mail.Send, но когда я пытаюсь опубликовать с этим токеном, я получаю 400: не удается POST / 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();
        });
    }
  );
});
...