Возможно ли получить AAD access_token из angular?

#angular #azure #http #azure-active-directory

#угловатый #azure #http #azure-активный каталог

Вопрос:

Я пытаюсь получить токен конечной точки ресурса управления Azure от angular, но я знаю, что это невозможно сделать на стороне clinet. По какой-то веской причине я все равно пытаюсь это сделать.

Поскольку я могу получить access_token, выполнив эту команду.

 curl -X GET -H 'Content-Type: application/x-www-form-urlencoded' 
-d 'grant_type=client_credentialsamp;client_id=<client-id>amp;resource=<management-resource-endpoint>amp;client_secret=<application-secret>' 
https://login.microsoftonline.com/<tenantid>/oauth2/token
 

Я пытаюсь преобразовать эту команду в http get-запрос, подобный этому…

 getAADToken() {
    const param = new HttpParams();
    param.append('grant_type', 'client_credentials');
    param.append('client_id', <client-id>);
    param.append('resource', '2ff814a6-3304-4ab8-85cb-cd0e6f879c1d');
    param.append('client_secret', <application-secret>);
    return this.http.get<any>("https://login.microsoftonline.com/<tenantid>/oauth2/token", {
      headers: new HttpHeaders().set('Content-Type', 'application/x-www-form-urlencoded'),
      params:param
    });
  }
 

но проблема с CORS…
введите описание изображения здесь

Ответ №1:

Вы не можете этого сделать, поскольку Azure AD не позволяет использовать поток учетных данных клиента из браузера. Они должны были бы разрешить запрос с перекрестным отправлением, который вы не можете настроить.

Существует много причин безопасности, по которым вы не можете этого сделать, наиболее очевидной из которых, о которой вы упомянули, является то, что секрет клиента виден любому, кто посещает страницу. Кроме того, любой, кто может получить файлы этой страницы, может работать с API как с приложением, поэтому отследить, кто на самом деле что-то сделал, становится довольно сложно.

Обычно, когда вам нужно что-то сделать как приложение, потому что пользователь не может этого сделать, у вас есть пользователь, проходящий аутентификацию во внешнем интерфейсе, вызывающий от его имени внутренний API, API авторизует пользователя, а затем выполняет аутентифицированный только для приложения вызов целевого API.