Как получить авторизацию в Microsoft AD с помощью curl?

У меня есть проект django, который использует Azure Active directory для аутентификации, и я настроил его API с помощью rest_framework. В настоящее время я пытаюсь получить доступ к этому API с помощью curl. Мне удается сгенерировать токен доступа, но когда я отправляю запрос с его помощью, я получаю страницу Microsoft Login Page, как будто у меня нет никакого токена доступа.

Я сгенерировал токен доступа, используя следующий код:

curl -X POST https://login.microsoftonline.com/{tenant_id}/oauth2/v2.0/token -H "Content-Type: application/x-www-form-urlencoded" -d "client_id={client_id}" -d "client_secret={client_secret}" -d "grant_type=client_credentials" -d "redirect_uri=https://{my_domain}/oauth2/callback" -d "scope=api://{tenant_id}/.default openid profile email" 

Затем, используя полученный jwt-токен, я сделал следующее:

curl -X GET -L https://<my_domain>/api/benches/1/status/ -H "Authorization: Bearer <token>"

И что я получаю, так это страницу входа в систему Microsoft, первые строки которой выглядят следующим образом:

<!-- Copyright (C) Microsoft Corporation. All rights reserved. -->
<!DOCTYPE html>
<html dir="ltr" class="" lang="en">
<head>
    <title>Sign in to your account</title>
.
.
.

Кроме того, результат -v (verbose) выглядит так:

Note: Unnecessary use of -X or --request, GET is already inferred.
* Host <my_domain>:443 was resolved.
* IPv6: (none)
* IPv4: ip
*   Trying ip:443...
* Connected to <my_domain> (ip) port 443
* schannel: disabled automatic use of client certificate
* ALPN: curl offers http/1.1
* ALPN: server accepted http/1.1
* using HTTP/1.x
> GET /api/benches/1/status/ HTTP/1.1
> Host: <my_domain>
> User-Agent: curl/8.7.1
> Accept: */*
> Authorization: Bearer <token>
>
* schannel: remote party requests renegotiation
* schannel: renegotiating SSL/TLS connection
* schannel: SSL/TLS connection renegotiated
* schannel: remote party requests renegotiation
* schannel: renegotiating SSL/TLS connection
* schannel: SSL/TLS connection renegotiated
< HTTP/1.1 302 Found
< Server: nginx/1.14.1
< Date: Wed, 17 Jul 2024 16:08:34 GMT
< Content-Type: text/html; charset=utf-8
< Content-Length: 0
< Connection: keep-alive
< Location: /oauth2/login?next=/api/benches/1/status/
< X-Frame-Options: DENY
< Vary: Cookie
< X-Content-Type-Options: nosniff
< Referrer-Policy: same-origin
<
* Request completely sent off
* Connection #0 to host <my_domain> left intact

Кроме того, я делаю это для своей организации, возможно ли, что в моем приложении Azure отсутствует разрешение, которое мне может понадобиться?

Обратите внимание на то, что: Клиентский мандатный поток не поддерживает тип делегированных разрешений. Если вы используете поток клиентских учетных данных для генерации токена, то вам необходимо предоставить приложению Microsoft Entra ID разрешения типа Api.

  • Поскольку вы предоставили делегированные права API приложению Microsoft Entra ID, вы должны сгенерировать токен, используя любой поток взаимодействия с пользователем, а не поток клиентских учетных данных.
  • Поток клиентских учетных данных не является пользовательским интерактивным.

Вы получаете ошибку, поскольку вы предоставили делегированные права на API и используете поток клиентских учетных данных для генерации токена.

Для устранения ошибки сгенерируйте токен с помощью потока кода авторизации, а затем вызовите API.

Я предоставил API разрешения приложению:

enter image description here

Настройте URL перенаправления как web с помощью https://oauth.pstmn.io/v1/callback' в приложении. Вы также можете передать свой собственный URL для перенаправления.

Теперь сгенерируйте токен доступа , выбрав поток кода авторизации :

Grant type: Authorization code 

Callback URL: https://oauth.pstmn.io/v1/callback
Auth URL:  https://login.microsoftonline.com/TenantId/oauth2/v2.0/authorize
Token URL : https://login.microsoftonline.com/TenantId/oauth2/v2.0/token
Client ID : ClientId
Client Secret : ClientSecret
Scope: api://ClientID/Benches.Change.All

enter image description here

И нажмите на кнопку Generate access token и вы будете перенаправлены в браузер для входа в систему:

enter image description here

Будет сгенерирован токен доступа:

enter image description here

Расшифруйте маркер доступа в jwt.ms: Welcome! и убедитесь, что формула scp имеет значение Benches.Change.All

enter image description here

Теперь используйте этот токен доступа для вызова API, и он будет успешным без каких-либо ошибок.

Вернуться на верх