Я использую office-js-helpers, чтобы получить токен OAuth в моем Веб-надстройка Outlook, поэтому я могу использовать ее для OAuthCredentials с управляемым API EWS (код для этого находится в службе приложений Azure с использованием веб-API ASP.NET).
Я настроил регистрацию приложения моего приложения в моем тестовом клиенте Office 365 (например, mytenant.onmicrosoft.com, который НЕ является той же подпиской Azure, в которой размещено веб-приложение - если это имеет значение) как собственное приложение с параметром oauth2AllowImplicitFlow, установленным в значение true. Я использовал тип приложения Native вместо приложения Web / API, чтобы обойти неожиданную ошибку, указывающую, что мое приложение требует согласия администратора - хотя разрешения приложения не запрашивались - но это уже другая история (возможно, я все равно должен использовать Native - не уверен на 100%) .
Я убедился, что URI перенаправления (также известный как URL-адрес ответа) в регистрации приложения указывает на ту же страницу, что и надстройка Outlook (например, https://mywebapp.azurewebsites.net/MessageRead.html).
Вот мой манифест приложения:
{
"appId": "a11aaa11-1a5c-484a-b1d6-86c298e8f250",
"appRoles": [],
"availableToOtherTenants": true,
"displayName": "My App",
"errorUrl": null,
"groupMembershipClaims": null,
"optionalClaims": null,
"acceptMappedClaims": null,
"homepage": "https://myapp.azurewebsites.net/MessageRead.html",
"identifierUris": [],
"keyCredentials": [],
"knownClientApplications": [],
"logoutUrl": null,
"oauth2AllowImplicitFlow": true,
"oauth2AllowUrlPathMatching": false,
"oauth2Permissions": [],
"oauth2RequiredPostResponse": false,
"objectId": "a11aaa11-99a1-4044-a950-937b484deb8e",
"passwordCredentials": [],
"publicClient": true,
"supportsConvergence": null,
"replyUrls": [
"https://myapp.azurewebsites.net/MessageRead.html"
],
"requiredResourceAccess": [
{
"resourceAppId": "00000003-0000-0000-c000-000000000000",
"resourceAccess": [
{
"id": "e1fe6dd8-ba31-4d61-89e7-88639da4683d",
"type": "Scope"
}
]
},
{
"resourceAppId": "00000002-0000-0000-c000-000000000000",
"resourceAccess": [
{
"id": "311a71cc-e848-46a1-bdf8-97ff7156d8e6",
"type": "Scope"
},
{
"id": "a42657d6-7f20-40e3-b6f0-cee03008a62a",
"type": "Scope"
}
]
},
{
"resourceAppId": "00000002-0000-0ff1-ce00-000000000000",
"resourceAccess": [
{
"id": "2e83d72d-8895-4b66-9eea-abb43449ab8b",
"type": "Scope"
},
{
"id": "ab4f2b77-0b06-4fc1-a9de-02113fc2ab7c",
"type": "Scope"
},
{
"id": "5eb43c10-865a-4259-960a-83946678f8dd",
"type": "Scope"
},
{
"id": "3b5f3d61-589b-4a3c-a359-5dd4b5ee5bd5",
"type": "Scope"
}
]
}
],
"samlMetadataUrl": null
}
Я также не забыл добавить URL-адреса авторизации в манифест моей надстройки:
<AppDomains>
<AppDomain>https://login.windows.net</AppDomain>
<AppDomain>https://login.microsoftonline.com</AppDomain>
</AppDomains>
Это код, который я использую в надстройке для аутентификации с помощью office-js-helpers:
// The Office initialize function must be run each time a new page is loaded.
Office.initialize = function(reason) {
$(document).ready(function () {
// Determine if we are running inside of an authentication dialog
// If so then just terminate the running function
if (OfficeHelpers.Authenticator.isAuthDialog()) {
// Adding code here isn't guaranteed to run as we need to close the dialog
// Currently we have no realistic way of determining when the dialog is completely
// closed.
return;
}
// Create a new instance of Authenticator
var authenticator = new OfficeHelpers.Authenticator();
authenticator.endpoints.registerAzureADAuth('a11aaa11-1a5c-484a-b1d6-86c298e8f250', 'mytenant.onmicrosoft.com');
// Add event handler to the button
$('#login').click(function () {
$('#token', window.parent.document).text('Authenticating...');
authenticator.authenticate('AzureAD', true)
.then(function (token) {
// Consume and store the acess token
$('#token', window.parent.document).text(prettify(token));
authToken = token.access_token;
})
.catch(function (error) {
// Handle the error
$('#token', window.parent.document).text(prettify(error));
});
});
});
};
Теперь код в надстройке может правильно войти в систему и запросить необходимые разрешения, но после нажатия кнопки Принять на этапе авторизации приложения возвращается следующая ошибка:
AADSTS50011: ответный адрес "https://mywebapp.azurewebsites.net" не соответствует адресам для ответа, настроенным для приложение: 'a11aaa11-1a5c-484a-b1d6-86c298e8f250'. Подробнее: не указано
Ошибка теперь возвращается каждый раз, когда я нажимаю кнопку «Войти» (пользователю больше не предлагается войти в систему). Он так и не получил токен. Полный URL-адрес авторизации:
Что я делаю неправильно? Может ли проблема быть связана с тем, что имя узла веб-приложения (URI перенаправления) не соответствует домену клиента Azure AD, на котором размещена регистрация приложения? Если да, как я могу предоставить разрешения для Exchange Online из моей подписки Azure, в которой размещено веб-приложение, в котором нет Office 365 или Exchange Online? Придется ли мне добавить подписку Azure в мой тестовый клиент Office 365, чтобы он также мог размещать веб-приложение?