Как получить авторизацию в 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 разрешения приложению:
Настройте 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
И нажмите на кнопку Generate access token и вы будете перенаправлены в браузер для входа в систему:
Будет сгенерирован токен доступа:
Расшифруйте маркер доступа в jwt.ms: Welcome! и убедитесь, что формула scp имеет значение Benches.Change.All
Теперь используйте этот токен доступа для вызова API, и он будет успешным без каких-либо ошибок.