如何使用curl在Microsoft AD中获得授权?

问题描述 投票:0回答:1

我有一个 django 项目,它使用 Azure Active Directory 进行身份验证,并且我已经使用 rest_framework 设置了其 API。目前,我正在尝试使用curl 访问此API。我能够生成访问令牌,但是当我使用它发送请求时,我得到 Microsoft 登录页面,就好像我没有任何访问令牌一样。

我使用以下代码生成了访问令牌:

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
(详细)的结果如下所示:

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 应用程序中可能需要的权限?

这里是我的权限刀片的屏幕截图。我正在使用 Benches.Change.All,它位于我的应用程序名称下。

enter image description here

django curl django-rest-framework azure-active-directory
1个回答
0
投票

注意:客户端凭证流不支持委派权限类型。如果您使用客户端凭据流来生成令牌,则需要向 Microsoft Entra ID 应用程序授予应用程序类型 Api 权限。

  • 由于您已向 Microsoft Entra ID 应用程序授予委派 API 权限,因此您必须使用任何用户交互流而不是客户端凭据流来生成令牌。
  • 客户端凭证流是非用户交互的。

当您授予委派 API 权限并利用客户端凭证流生成令牌时,您会收到 错误

解决错误。使用授权代码流程生成令牌,然后调用 API。

我向应用程序授予了 API 权限

enter image description here

在应用程序中使用

https://oauth.pstmn.io/v1/callback'
将重定向 URL 配置为 Web。

现在通过选择授权代码流程生成访问令牌:

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

并且单击“生成访问令牌”,您将被重定向到浏览器进行登录:

enter image description here

将生成访问令牌:

enter image description here

解码 jwt.ms 中的访问令牌:欢迎! 并确保 scp 声明具有值

Benches.Change.All

enter image description here

现在使用这个访问令牌调用API,就会成功,不会出现任何错误。

© www.soinside.com 2019 - 2024. All rights reserved.