Я пытаюсь получить токен доступа из Azure Active Directory программно, используя следующий метод в приложении Angular 6.
let body1 = new FormData()
body1.append("resource", environment.config.clientId)
body1.append("grant_type", "client_credentials")
body1.append("client_id", environment.config.clientId)
body1.append("client_secret", "*****")
return this._http.post("https://login.microsoftonline.com/" + environment.config.tenant + "/oauth2/token", body1)
Мне удалось получить токен доступа через этот URL-адрес в Postman, но я заблокирован CORS при вызове его через мое приложение. Ошибка ниже.
Failed to load https://login.microsoftonline.com/*****/oauth2/token:
Response to preflight request doesn't pass access control check: No 'Access-
Control-Allow-Origin' header is present on the requested resource. Origin
'http://localhost:4200' is therefore not allowed access.
Итак, как мне включить CORS в Azure Active Directory для всех доменов?





Просто вы этого не сделаете.
Вы раскрываете секрет клиента своего приложения публике. Помните, что запрос будет сделан из устройство пользователя. Чтобы они могли наблюдать за ним и запечатлеть ваш секрет. Вот почему конечная точка токена не поддерживает CORS и, вероятно, никогда не будет.
ОБНОВЛЕНИЕ: конечная точка токена теперь поддерживает CORS, если вы настроили URL-адрес ответа с платформой SPA. Это позволяет использовать поток кода авторизации с PKCE. MSAL.js 2.0 поддерживает этот поток. Обратите внимание, что это все еще не связано с секретом клиента.
Способ получения токенов из интерфейсного JS-приложения - использовать неявный поток предоставления или поток кода авторизации с PKCE. Или, если вам нужен токен только для приложения, вы должны выполнить запрос, который вы пробовали, из внутреннего приложения.
Неявный поток предоставления позволяет получать токены непосредственно из конечной точки авторизации при входе пользователя в систему. Вы можете использовать ADAL.JS / MSAL.JS, чтобы помочь в этом. У вас не может быть токенов без идентификатора пользователя, поскольку ваше собственное приложение не может подтвердить его личность.
Спасибо @juunas за информацию. Я использую адал в своем приложении для входа пользователя, но есть часть приложения, в которой я хочу, чтобы пользователь мог видеть некоторые конкретные личные данные без необходимости входа в систему (я не могу сделать данные, которые я пытаюсь получить общедоступный). Это приложение не будет разворачиваться и, по сути, является доказательством правильности концепции, поэтому я ищу способ решения этой проблемы. Вы знаете, как программно войти в систему, чтобы пользователю не приходилось этого делать? С адалем или нет?
Вам понадобится серверная часть для вашего приложения, которая получает данные и возвращает их для интерфейса.
Хммм ... Что делать, если мы хотим использовать поток PKCE в браузере? Разве неявный поток не был удален из рекомендуемых передовых практик?
Я не думаю, что PKCE пока поддерживается в Azure AD для этого сценария. Так что скрытый путь - это время.
Или используйте файлы cookie для внешнего интерфейса и выполните аутентификацию на сервере
«Конечная точка токена теперь поддерживает CORS», как именно это включить?
Вам необходимо добавить платформу «SPA» к вашей регистрации приложения и добавить к ней URL-адреса ответов.
Добавление «SPA» почти сработало, так как теперь запрос опций предварительной проверки теперь возвращает ОК. Однако, несмотря на то, что в ответе предварительной проверки есть Access-Control-Allow-Origin: *, браузер все еще имеет ошибку в консоли из источника. 'локальный: 44386' был заблокирован политикой CORS: заголовок 'Access-Control-Allow-Origin' отсутствует на запрошенном ресурсе. Если непрозрачный ответ отвечает вашим потребностям, установите режим запроса на 'no-cors', чтобы получить ресурс с отключенным CORS.
Вы используете новую версию MSAL.js? npmjs.com/package/@azure/msal-browser
+1 К этому ответу. CORS блокирует вас, потому что вы пытаетесь сделать что-то в браузере, что вы должны сделать в браузере никогда.