为 Microsoft Graph 正确格式化 curl 请求 API

Formating curl request correctly for Microsoft Graph API

编辑:我相信我能正常工作我的更新如下

我正在尝试使用 curl 从 Microsoft graph api 检索令牌。我有来自应用程序注册门户的 application IDTenant IDclient secret valueclient secret secret id,所以我假设我拥有获得令牌所需的一切。

我在第 4 部分:https://docs.microsoft.com/en-us/graph/auth-v2-service

在那里的文档中显示了这样的示例:

// Line breaks are for legibility only.

POST https://login.microsoftonline.com/{tenant}/oauth2/v2.0/token HTTP/1.1
Host: login.microsoftonline.com
Content-Type: application/x-www-form-urlencoded

client_id=535fb089-9ff3-47b6-9bfb-4f1264799865
&scope=https%3A%2F%2Fgraph.microsoft.com%2F.default
&client_secret=qWgdYAmab0YSkuL1qKv5bPX
&grant_type=client_credentials

我试过那种格式,但对我来说失败了:

curl POST https://login.microsoftonline.com/MYTENANTNUMBER/oauth2/v2.0/token HTTP/1.1 Host:login.microsoftonline.com Content-Type:application/x-www-form-urlencoded client_id=ENTERCLIENTIDHERE&scope=https%3A%2F%2Fgraph.microsoft.com%2F.default&client_secret=ENTERCLIENTSECRETEHERE&grant_type=client_credentials

我也尝试了几种不同的方法,但都失败了。这是结束,因为这个没有给我任何错误,但它也没有回应任何东西:

curl -H "Host:login.microsoftonline.com" -H "Content-Type:application/x-www-form-urlencoded" -H "client_id=ENTERCLIENTIDHERE&scope=https%3A%2F%2Fgraph.microsoft.com%2F.default&client_secret=ENTERCLIENTSECRETEHERE&grant_type=client_credentials" "https://login.microsoftonline.com/MYTENANTNUMBER/oauth2/v2.0/token%20HTTP/1.1"

如果有人有任何想法,请告诉我。谢谢

更新 - 我想我已经成功了,但我希望有人仔细检查我的代码以确保 我认为这让我得到了我需要的东西:

curl -n -v -i -H "Host:login.microsoftonline.com" -H "Content-Type:application/x-www-form-urlencoded" -d "client_id=ENTERCLIENTIDHERE&scope=https%3A%2F%2Fgraph.microsoft.com%2F.default&client_secret=ENTERCLIENTSECRETEHERE&grant_type=client_credentials" "https://login.microsoftonline.com/MYTENANTNUMBER/oauth2/v2.0/token"

我不得不把url末尾的HTTP/1.1去掉。在微软的文档中,他们在 url 中使用了它,所以我不确定为什么没有它它就可以工作。 这是我得到的回复,我认为 是我需要的:

{"token_type":"Bearer","expires_in":3599,"ext_expires_in":3599,"access_token":"SOMESUPERLONGTOKENTHINGYTHATIAMNOTGOINGTOPUTINHERE"}*

再次感谢!

那就是

curl -d 'client_id'='535fb089-9ff3-47b6-9bfb-4f1264799865' \
-d 'scope'='https://graph.microsoft.com/.default' \
-d 'client_secret'='qWgdYAmab0YSkuL1qKv5bPX' \
-d 'grant_type'='client_credentials' \
 'https://login.microsoftonline.com/{tenant}/oauth2/v2.0/token'

curl 会处理剩下的事情,curl 实际发送的请求类似于

$ nc -l 9999
POST /https://login.microsoftonline.com/tenant/oauth2/v2.0/token HTTP/1.1
Host: localhost:9999
User-Agent: curl/7.77.0
Accept: */*
Content-Length: 157
Content-Type: application/x-www-form-urlencoded

client_id=535fb089-9ff3-47b6-9bfb-4f1264799865&scope=https://graph.microsoft.com/.default&client_secret=qWgdYAmab0YSkuL1qKv5bPX&grant_type=client_credentials

(我用 netcat 记录,将 url 更改为 http://localhost:9999/https://login.microsoftonline.com/{tenant}/oauth2/v2.0/token

fwiw 命令是使用 php 代码生成的

<?php

$str='client_id=535fb089-9ff3-47b6-9bfb-4f1264799865&scope=https%3A%2F%2Fgraph.microsoft.com%2F.default&client_secret=qWgdYAmab0YSkuL1qKv5bPX&grant_type=client_credentials';
parse_str($str,$res);
$cmd="curl ";
foreach($res as $key=>$val){
    $cmd.="-d ".escapeshellarg($key)."=".escapeshellarg($val)." \\n";
}
echo $cmd;

当用-d添加POST数据时,curl会自动将请求更改为POST请求(远离默认的GET请求),并添加Content-Type: application/x-www-form-urlencoded header,并添加实际的 post 数据,并对数据进行编码,通常您应该 而不是 添加 Host: login.microsoftonline.com -header 手动,curl 将为您生成 header。 (在某些特殊情况下,例如在调试 DNS 问题时,手动生成 header 是有用的,但在您的情况下不是这样,除非您是调试 DNS 问题的 login.microsoftonline.com 系统管理员,这显然不是'事实如此)