Я хочу сделать то же, что и приложение-образец узла 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();
});
}
);
});