Аутентификация Microsoft EWS с использованием Nodejs через SOAP с сертификатом x509

Я добился большого успеха с Microsoft Graph API для доступа к пользователям и т. Д. В Azure Active Directory, однако две вещи, которые по-прежнему требуют EWS и SOAP, - это получение фотографий пользователей и добавление почтового правила в почтовый аккаунт пользователя. Я использую учетные записи служб для всего и выдаю себя за администратора учетной записи, чтобы делать запросы.

После попытки использовать тот же токен доступа, который я использую для API Graph, я получаю сообщение об ошибке: The access token is acquired using an authentication method that is too weak to allow access for this application. Presented auth strength was 1, required is 2.

Читая вокруг, я понимаю, что, поскольку EWS требует полных привилегий для учетных записей, вы не можете просто передать токен доступа, но вам также нужно «что-то сделать» с сертификатом x509.

В моем зарегистрированном приложении в Azure я скорректировал манифест, включив в него самоподписанный сертификат, чтобы у меня были:

 "keyCredentials": [{
  "customKeyIdentifier": "lhbl...../w0bjA6l1mQ8=",
  "keyId": "774D2C35-2D58-.....-AC34B15472BA",
  "type": "AsymmetricX509Cert",
  "usage": "Verify",
  "value": "MIIFtTCCA52gAwIB.....mmgufQ2rW5GSjEEXOlO1c7qw=="
}],

Насколько я понимаю, customKeyIdentifier - это Base64 ключа из команды: echo $(openssl x509 -in cert.pem -fingerprint -noout) | sed 's/SHA1 Fingerprint=//g' | sed 's/://g' | xxd -r -ps | base64

value - это буквально ключевой контент с удаленными -----BEGIN CERTIFICATE----- и -----END CERTIFICATE-----, а также удаленными всеми новыми строками (в противном случае в манифесте json недействителен).

keyId - это GUID, который я только что сгенерировал на терминале с помощью команды uuidgen, я не думаю, что он каким-либо образом связан напрямую с сертификатом.

В чем я не уверен, так это то, что мне нужно изменить в моем коде, который будет пытаться выполнить аутентификацию против EWS.

Я начал с библиотеки node-ews, моя конфигурация выглядит так:

var ewsConfig = {
username: userEmail,
token: self.accessToken,
host: 'https://outlook.office365.com/EWS/Exchange.asmx',
auth: 'bearer'
};
var ews = new EWS(ewsConfig);
var ewsFunction = 'UpdateInboxRules';
ews.run(ewsFunction, ewsArgs)
  .then(result => {
    cb(null, result)
  })
  .catch(err => {
    cb(err);
  });
};

self.accessToken - это тот же токен, который я получаю при доступе к Microsoft Graph API.

Итак, в заключение, мои вопросы:

  1. Что мне нужно сделать с моим запросом, чтобы я сказал серверу также аутентифицировать сертификат x509, я читал, что мне также может потребоваться преобразовать его в сертификат PKCS12?
  2. Могу ли я использовать тот же токен доступа, который я успешно использую для доступа к api графика?
  3. Есть ли где-нибудь фрагмент кода, чтобы Nodejs делал это?
  4. Может ли keyId быть любым идентификатором, который я хочу ему дать?

Ответ, который я получаю, содержит:

{ 'content-length': '0',
        server: 'Microsoft-IIS/8.5',
        'request-id': '9b0d7a1b-85e6-40f6-9af0-7f65fc6669dc',
        'x-calculatedfetarget': 'MM1P123CU001.internal.outlook.com',
        'x-backendhttpstatus': '401, 401',
        'set-cookie': [Object],
        'x-feproxyinfo': 'MM1P123CA0026.GBRP123.PROD.OUTLOOK.COM',
        'x-calculatedbetarget': 'MM1P123MB1337.GBRP123.PROD.OUTLOOK.COM',
        'x-ms-diagnostics': '2000001;reason="The access token is acquired using an authentication method that is too weak to allow access for this application. Presented auth strength was 1, required is 2.";error_category="invalid_token"',
        'x-diaginfo': 'MM1P123MB1337',
        'x-beserver': 'MM1P123MB1337',
        'x-feserver': 'MM1P123CA0026, VI1PR0701CA0059',
        'x-powered-by': 'ASP.NET',
        'www-authenticate': 'Bearer client_id="00000002-0000-0ff1-ce00-000000000000", trusted_issuers="00000001-0000-0000-c000-000000000000@*", token_types="app_asserted_user_v1 service_asserted_app_v1", authorization_uri="https://login.windows.net/common/oauth2/authorize", error="invalid_token",Basic Realm="",Basic Realm="",Basic Realm=""',
        date: 'Tue, 02 May 2017 18:08:54 GMT',
        connection: 'close' } }

Спасибо, очень признателен


person amlwwalker    schedule 02.05.2017    source источник


Ответы (1)


Я следил за этой статьей, чтобы сгенерировать access_token https://blogs.msdn.microsoft.com/arsen/2015/09/18/certificate-based-auth-with-azure-service-principals-from-linux-команднаястрока/, были проблемы с подписью jwt, мне пришлось использовать openssl rsa -check -in key.pem, чтобы расшифровать ключ и сохранить его в текстовом файле. тогда подписание jwt сработало. Вы также должны выдавать себя за другое лицо, см. Этот https://github.com/CumberlandGroup/node-ews/issues/39

это может помочь с node-ews. Я не тестировал этот сценарий с node-ews. Если вас интересует более надежный подход с управляемым API-интерфейсом ews, например, с кодированием, я портировал версию ews-managed-api на ews-javascript-api здесь это образец кода для достижения того же с ews-javascript-api, протестированный и подтвержденный рабочий код.

var ews = require("ews-javascript-api");
ews.EwsLogging.DebugLogEnabled = false;
var exch = new ews.ExchangeService(ews.ExchangeVersion.Exchange2013);
exch.Credentials = new ews.OAuthCredentials("oauth access_token");
exch.Url = new ews.Uri("https://outlook.office365.com/Ews/Exchange.asmx");
exch.ImpersonatedUserId = new 
ews.ImpersonatedUserId(ews.ConnectingIdType.SmtpAddress, "[email protected]");
exch.HttpHeaders = { "X-AnchorMailbox": "[email protected]" };
var rule = new ews.Rule();
rule.DisplayName = "MoveInterestingToJunk";
rule.Priority = 1;
rule.IsEnabled = true;
rule.Conditions.ContainsSubjectStrings.Add("Interesting");
rule.Actions.MoveToFolder = new ews.FolderId(ews.WellKnownFolderName.JunkEmail);
var ruleop = new ews.CreateRuleOperation(rule);
exch.UpdateInboxRules([ruleop], true)
    .then(function (response) {
    console.log("success - update-inboxrules");
    ews.EwsLogging.Log(response, true, true);
}, function (err) {
    debugger;
    console.log("error in update-inboxrules");
    ews.EwsLogging.Log(err, true, true);
});
person Gautam Singh    schedule 04.05.2017
comment
Привет, спасибо за это, я просто читаю вашу документацию на github, просто чтобы понять аутентификацию, я вижу, где у вас ews.OAuthCredentials("oauth access_token"), это буквально означает это, или мне следует заменить access_token фактическим токеном доступа, который я получил ранее ? Если нет, то куда он денется? Я предполагаю, что меняю адрес электронной почты [email protected] на любого пользователя, которого я выдаю за себя при получении токена. - person amlwwalker; 16.05.2017
comment
Вы должны заменить oauth access_token фактическим токеном, который вы получили от Microsoft после завершения последовательности OAuth. Мне следовало использовать общие адреса электронной почты, а не мой личный тестовый (при редактировании я переименую во что-нибудь другое). вы должны использовать адрес электронной почты фактического почтового ящика, за которого вы выдаете себя. убедитесь, что не произошла утечка токена авторизации. - person Gautam Singh; 16.05.2017