Php 正在从Microsoft Graph API接收访问令牌,但不是刷新令牌

Php 正在从Microsoft Graph API接收访问令牌,但不是刷新令牌,php,curl,outlook,microsoft-graph-api,Php,Curl,Outlook,Microsoft Graph Api,我正在使用Graph API从Outlook获取日历数据。为此,我通过OAuth2.0API对用户进行身份验证。当用户授予权限时,我可以毫无问题地获得访问令牌。但不幸的是,刷新令牌不能刷新访问令牌 这是我的代码: <?php $client_id = "MY_CLIENT_ID"; $client_secret = "MY_CLIENT_SECRET"; $redirect = "MY_REDIRECT_URI"; if (!isset($_GET["code"])) { ?&g

我正在使用Graph API从Outlook获取日历数据。为此,我通过OAuth2.0API对用户进行身份验证。当用户授予权限时,我可以毫无问题地获得访问令牌。但不幸的是,刷新令牌不能刷新访问令牌

这是我的代码:

<?php
$client_id = "MY_CLIENT_ID";
$client_secret = "MY_CLIENT_SECRET";
$redirect = "MY_REDIRECT_URI";

if (!isset($_GET["code"])) {
    ?>
    <a class="btn btn-default-active" href="<?php
       echo "https://login.microsoftonline.com/common/oauth2/v2.0/authorize?"
       . "client_id=$client_id"
       . "&"
       . "scope="
       . "https%3A%2F%2Fgraph.microsoft.com%2FUser.Read"
       . "%20"
       . "https%3A%2F%2Fgraph.microsoft.com%2FCalendars.Read"
       . "%20"
       . "https%3A%2F%2Fgraph.microsoft.com%2FCalendars.Read.Shared"
       . "&response_type=code"
       . "&redirect_uri=" . urlencode($redirect);
       ?>">Mit Office 365 verbinden</a><?php
} else {
    $code = $_GET["code"];

    $curl = curl_init();

    curl_setopt_array($curl, array(
        CURLOPT_URL => "https://login.microsoftonline.com/common/oauth2/v2.0/token",
        CURLOPT_RETURNTRANSFER => true,
        CURLOPT_ENCODING => "",
        CURLOPT_MAXREDIRS => 10,
        CURLOPT_TIMEOUT => 30,
        CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
        CURLOPT_CUSTOMREQUEST => "POST",
        CURLOPT_HTTPHEADER => array(
            "Content-type"=>"application/x-www-form-urlencoded",
            "Content-Length"=>144
        ),
        CURLOPT_POSTFIELDS => array(
            "grant_type" => "authorization_code",
            "client_id" => $client_id,
            "client_secret" => $client_secret,
            "code" => $code,
            "redirect_uri" => $redirect),
    ));

    $response = curl_exec($curl);
    $err = curl_error($curl);

    curl_close($curl);

    if ($err) {
        echo "cURL Error #:" . $err;
    } else {
        echo $response;
    }
}
?>
在我的例子中,响应看起来是这样的:

{
"token_type":"Bearer",
"scope":"https://graph.microsoft.com/calendars.read https://graph.microsoft.com/calendars.read.shared https://graph.microsoft.com/user.read",
"expires_in":3599,
"ext_expires_in":0,
"access_token":"ACCESS_TOKEN"
}
我还尝试添加了ressource标记,但仍然不起作用。出什么事了

更新

我现在尝试添加属性:

CURLOPT_POSTFIELDS => array(
        "grant_type" => "authorization_code",
        "client_id" => $client_id,
        "client_secret" => $client_secret,
        "code" => $code,
        "redirect_uri" => $redirect,
        "prompt"=>"consent"),

它仍然不起作用。

正如DalmTo所说,您需要请求脱机访问以获取刷新令牌。您可以通过将
脱机访问
添加到
范围

就你而言:

echo "https://login.microsoftonline.com/common/oauth2/v2.0/authorize?"
   . "client_id=$client_id"
   . "&"
   . "scope="
   . "offline_access"
   . "%20"
   . "https%3A%2F%2Fgraph.microsoft.com%2FUser.Read"
   . "%20"
   . "https%3A%2F%2Fgraph.microsoft.com%2FCalendars.Read"
   . "%20"
   . "https%3A%2F%2Fgraph.microsoft.com%2FCalendars.Read.Shared"
   . "&response_type=code"
   . "&redirect_uri=" . urlencode($redirect);

您可能需要请求脱机访问以获取刷新令牌。好的,我该怎么做?尝试向您的初始身份验证请求添加prompt=approve。如果您收到刷新令牌,请告诉我。谢谢您的回答。我已经更新了我的问题我做了什么。但我还是没有给我一个刷新令牌。它很有效,非常感谢。但是您必须替换下划线字符中的点,以便从脱机访问到脱机访问。感谢您注意到这个输入错误
echo "https://login.microsoftonline.com/common/oauth2/v2.0/authorize?"
   . "client_id=$client_id"
   . "&"
   . "scope="
   . "offline_access"
   . "%20"
   . "https%3A%2F%2Fgraph.microsoft.com%2FUser.Read"
   . "%20"
   . "https%3A%2F%2Fgraph.microsoft.com%2FCalendars.Read"
   . "%20"
   . "https%3A%2F%2Fgraph.microsoft.com%2FCalendars.Read.Shared"
   . "&response_type=code"
   . "&redirect_uri=" . urlencode($redirect);