У меня есть одностраничное приложение, написанное на TypeScript. Он должен вызывать службу среднего уровня, а служба среднего уровня, в свою очередь, вызывает Microsoft Graph API.
В моем SPA я использую библиотеку MSAL и регистрирую пользователя, вызывая UserAgentApplication.loginRedirect ()
Затем я вызываю acquTokenPopup и передаю только одну область в параметре запроса маркера доступа: область, определенную моей службой среднего уровня. После этого я вижу всплывающее окно, но затем оно исчезает (я никогда не вижу никакого согласия). Это успешно получает токен, который SPA затем отправляет в качестве токена канала-носителя в заголовке авторизации в запросе HTTPS на промежуточный уровень.
Затем средний уровень пытается получить токен OBO, вызывая AAD со следующими свойствами:
const grantType = "urn:ietf:params:oauth:grant-type:jwt-bearer";
const assertion = userAccessToken;
const scope = "https://graph.microsoft.com/Calendars.Read " +
"https://graph.microsoft.com/Calendars.Read.Shared " +
"https://graph.microsoft.com/Calendars.ReadWrite " +
"https://graph.microsoft.com/Calendars.ReadWrite.Shared " +
"openid profile email offline_access";
const requestedTokenUse = "on_behalf_of";
У него также есть секретный ключ клиента, который он передает, который определен в регистрации AAD для промежуточного уровня. Когда этот запрос передается конечной точке AAD для получения токена OBO, он всегда завершается ошибкой:
{"error":"invalid_grant","error_description":"AADSTS65001: The user or administrator has not consented to use the application with ID '<ID of middle-tier application>' named '<name of middle-tier application>'. Send an interactive authorization request for this user and resource.\r\nTrace ID: 39d9bace-03f0-402b-9310-c713aa990200\r\nCorrelation ID: edfbb88f-5c63-4cef-84c1-0de8457852b7\r\nTimestamp: 2019-05-22 22:25:24Z","error_codes":[65001],"timestamp":"2019-05-22 22:25:24Z","trace_id":"39d9bace-03f0-402b-9310-c713aa990200","correlation_id":"edfbb88f-5c63-4cef-84c1-0de8457852b7","suberror":"consent_required"}
Я вижу, что требуется согласие и как я должен отправить интерактивный запрос на авторизацию, но я не уверен, как это сделать. На самом деле, я думал, что делал это, когда сначала вызывал acquTokenPopup (а не acquTokenSilent).
Если вызов acquTokenPopup в клиенте SPA с определенной областью среднего уровня не является правильным способом отправки интерактивного запроса на авторизацию, что это такое?
Возможно, полезная информация:
- Идентификатор моего клиентского приложения SPA указывается как в разделе «Авторизованные клиентские приложения» портала регистрации AAD для промежуточного уровня, так и в разделе «knownClientApplications» манифеста.
Спасибо!