我有一个 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,它位于我的应用程序名称下。
注意:客户端凭证流不支持委派权限类型。如果您使用客户端凭据流来生成令牌,则需要向 Microsoft Entra ID 应用程序授予应用程序类型 Api 权限。
当您授予委派 API 权限并利用客户端凭证流生成令牌时,您会收到 错误。
解决错误。使用授权代码流程生成令牌,然后调用 API。
我向应用程序授予了 API 权限:
在应用程序中使用
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
并且单击“生成访问令牌”,您将被重定向到浏览器进行登录:
将生成访问令牌:
解码 jwt.ms 中的访问令牌:欢迎! 并确保 scp 声明具有值
Benches.Change.All
现在使用这个访问令牌调用API,就会成功,不会出现任何错误。