Php 正在从Microsoft Graph API接收访问令牌,但不是刷新令牌
我正在使用Graph API从Outlook获取日历数据。为此,我通过OAuth2.0API对用户进行身份验证。当用户授予权限时,我可以毫无问题地获得访问令牌。但不幸的是,刷新令牌不能刷新访问令牌 这是我的代码: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
<?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);