Office365 OAuth -通过CURL的令牌

33qvvth1  于 2022-11-13  发布在  其他
关注(0)|答案(1)|浏览(187)

我正在尝试连接到Azure平台以获取响应,主要是为了获取访问office365邮箱时使用的令牌
下面是我正在使用的,但我总是得到NULL响应
需要包括哪些其他CURLOPT_POSTFIELDS,或者需要更改哪些其他内容。

$curl = curl_init();
    curl_setopt_array($curl, array(
      CURLOPT_URL => "https://login.microsoftonline.com/".$tennantid."/oauth2/v2.0/authorize",
      CURLOPT_RETURNTRANSFER => true,
      CURLOPT_ENCODING => '',
      CURLOPT_MAXREDIRS => 10,
      CURLOPT_TIMEOUT => 0,
      CURLOPT_FOLLOWLOCATION => true,
      CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
      CURLOPT_CUSTOMREQUEST => 'POST',
      CURLOPT_POSTFIELDS => 'client_id='.$appid.'&response_type=token&scope=https://graph.microsoft.com/User.Read&redirect_uri='.$uri,
      CURLOPT_HTTPHEADER => array(
        'Content-Type: application/x-www-form-urlencoded'
      ),
    ));
    
    $response = curl_exec($curl);
    $response_decode = json_decode($response);
var_dump($response_decode);
    curl_close($curl);

当我使用下面的方法时,我当前可以取回令牌

$params = array ('client_id' =>$appid,
  'redirect_uri' =>$uri,
  'response_type' =>'token',
   'response_mode' =>'form_post',
  'scope' =>'https://graph.microsoft.com/User.Read',
  'state' =>$_SESSION['state']);
  header ('Location: '.$login_url.'?'.http_build_query ($params));

这样很好。
但我需要执行CURL方法,因为我需要此正在运行的后台cron作业任务
我好像错过了什么?
先谢谢你

jv2fixgn

jv2fixgn1#

一个API文档的链接可能会有帮助。如果没有这个,我就帮不上什么忙。只是一件显而易见的事情。
您使用的是Content-Type: application/x-www-form-urlencoded
您没有对数据进行编码。来自MDN:
应用程序/x-www-表单-URL编码:键和值以键-值元组的形式进行编码,元组之间用“&”分隔,键和值之间用“=”分隔。键和值中的非字母数字字符都采用percent编码:这就是此类型不适合与二进制数据一起使用的原因(请改用multipart/form-data)
来源:MDN Post data
这意味着您的请求数据应如下所示:

client_id%3D1234%26response_type%3Dtoken%26scope%3Dhttps%3A%2F%2Fgraph.microsoft.com%2FUser.Read%26redirect_uri%3Dhttp%3Aexample.com

试试看:

$post = urlencode('client_id='.$appid.'&response_type=token&scope=https://graph.microsoft.com/User.Read&redirect_uri=http:example.com');
CURLOPT_POSTFIELDS => $ post,

相关问题