на Microsoft Graph API они предоставляют версии 1.0 и v2.0
в версии 1.0 мы использовали код, указанный в документе, но он не работает, и мы не можем получить доступ к токену.
и везде только что упоминались все API, которые есть в версии 1.0, и нет примера добавления событий календаря в версии 2.0.
infect я использовал их коллекцию почтальонов и использовал ее для генерации токена.
его токен успешно сгенерирован.
но когда я использовал API, который получает события моего календаря, он возвращает мне
{
"error": {
"code": "OrganizationFromTenantGuidNotFound",
"message": "The tenant for tenant guid 'f3fd3de8-d438-4470-b351-5a7dde989db8' does not exist.",
"innerError": {
"oAuthEventOperationId": "10aaa007-edfb-4d36-ab46-d68e51af1e28",
"oAuthEventcV": "bFc6s7xHD3sZPpSDf6Ve5Q.1.1",
"errorUrl": "https://aka.ms/autherrors#error-InvalidTenant",
"requestId": "41ca535c-2339-4e95-8915-2f1cdda88231",
"date": "2024-06-10T06:12:02"
}
}
}
Я искал множество примеров и документов, но не нашел никакого решения.
в конце я обнаружил, что сгенерированный мной токен правильный, но когда я вызываю любой календарь addd или получаю API событий, он выдает мне эту ошибку.
Я добавил в приложение все полные разрешения для календарей.
Он должен добавить событие в календарь
некоторые динамические значения, которые мы должны добавить к этим переменным.
$url = "https://login.microsoftonline.com/$row_comp->ol_tenant_id/oauth2/authorize?client_id=$row_comp->ol_client_id&response_type=code&redirect_uri=$url_auth&response_mode=query&scope=api://$row_comp->ol_client_id/Calendars.ReadWrite%20offline_access&state=12345";
выше — URL-адрес.
и по URL-адресу авторизации я добавил запрос на завивку
$url = "https://login.microsoftonline.com/$tenant/oauth2/v2.0/token";
$data = [
'client_id' => $clientId,
'scope' => "Calendars.ReadBasic openid profile offline_access",
'code' => $authorizationCode,
'redirect_uri' => $redirectUri,
'grant_type' => 'authorization_code',
'client_secret' => $clientSecret
];
$options = [
CURLOPT_URL => $url,
CURLOPT_POST => true,
CURLOPT_POSTFIELDS => http_build_query($data),
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => [
'Content-Type: application/x-www-form-urlencoded'
],
];
$ch = curl_init();
curl_setopt_array($ch, $options);
$response = curl_exec($ch);
if (curl_errno($ch)) {
$error_msg='1 :. Error:' . curl_error($ch);
}
curl_close($ch);
$responseData = json_decode($response, true);
$full_object['first_call']=json_decode($response);
if (isset($responseData['error'])) {
$error_msg= "1 :. Error: " . $responseData['error_description'] . "\n";
} else {
if (isset($responseData['refresh_token']))
{
$ol_access_token_old=$responseData['access_token'];
$ol_refresh_token_old=$responseData['refresh_token'];
$accessToken = $responseData['access_token'];
$refreshToken = $responseData['refresh_token'];
}
}
А затем вызовите токен обновления
if ($refreshToken! = "")
{
$url = "https://login.microsoftonline.com/$tenant/oauth2/v2.0/token";
$params=[];
$params['url']=$url;
$params['clientId']=$clientId;
$params['refreshToken']=$refreshToken;
$params['clientSecret']=$clientSecret;
$res_data=RefreshToeknOutlook($params);
$full_object['second_call']=$res_data['full_res'];
$error_msg=$res_data['error_msg'];
$ol_access_token_new=$res_data['ol_access_token_new'];
$ol_refresh_token_new=$res_data['ol_refresh_token_new'];
$ol_token_expiry_date=$res_data['ol_token_expiry_date'];
if ($ol_access_token_new! = "" && $error_msg= = "")
{
$dt=date("Y-m-d H:i:s");
$ol_token_expiry_date=date("Y-m-d H:i:s",strtotime($dt." +".$ol_token_expiry_date." seconds"));
$sql_update = "update tbl_admin set ol_authorization_code='".$db->real_escape_string($code)."'";
$sql_update. = ",ol_access_token_old='".$db->real_escape_string($ol_access_token_old)."'";
$sql_update. = ",ol_refresh_token_old='".$db->real_escape_string($ol_refresh_token_old)."'";
$sql_update. = ",ol_access_token_new='".$db->real_escape_string($ol_access_token_new)."'";
$sql_update. = ",ol_refresh_token_new='".$db->real_escape_string($ol_refresh_token_new)."'";
$sql_update. = ",ol_token_expiry_date='".$db->real_escape_string($ol_token_expiry_date)."'";
$sql_update. = ",ol_log_text='".$db->real_escape_string(json_encode($full_object))."'";
$sql_update. = " where id='".$row_comp->id."'";
$db->query($sql_update);
}
}
Вышеуказанная функция возвращает токен. и используя это, я звоню
https://graph.microsoft.com/v1.0/me/events
но он возвращается
{
"error": {
"code": "OrganizationFromTenantGuidNotFound",
"message": "The tenant for tenant guid 'f3fd3de8-d438-4470-b351-5a7dde989db8' does not exist.",
"innerError": {
"oAuthEventOperationId": "10aaa007-edfb-4d36-ab46-d68e51af1e28",
"oAuthEventcV": "bFc6s7xHD3sZPpSDf6Ve5Q.1.1",
"errorUrl": "https://aka.ms/autherrors#error-InvalidTenant",
"requestId": "41ca535c-2339-4e95-8915-2f1cdda88231",
"date": "2024-06-10T06:12:02"
}
}
}
Да конечно. обновляю эти данные по вопросу, подождите
@Sridevi, я обновил вопрос с подробностями
Используете ли вы личную учетную запись Microsoft, например Outlook?
@ Шридеви, да. одна из моих учетных записей, которую я зарегистрировал в Outlook, принадлежит Gmail
Какой тип учетной записи вы выбрали на портале при регистрации приложения Azure AD?
Давайте продолжим обсуждение в чате.
@Sridevi, мне нужна помощь в создании токена обновления prnt.sc/zaudnSFYhecT






Ошибка произошла, когда вы зарегистрировали приложение с поддерживаемым типом учетной записи как «Учетные записи в любом каталоге организации (любой клиент Microsoft Entra ID — мультитенант)», которое не будет работать с личными учетными записями Microsoft.
Чтобы устранить эту ошибку, вам необходимо создать регистрацию приложения с указанным ниже типом учетной записи, которая позволяет пользователям входить в систему с личными учетными записями Microsoft:
Теперь я добавил Calendars.Read разрешение типа «Делегированный» в свое приложение, как показано ниже:
Чтобы получить значение кода, я выполнил ниже запрос авторизации с конечной точкой /common в браузере Incognito, который просил пользователя войти в систему следующим образом:
https://login.microsoftonline.com/common/oauth2/v2.0/authorize
?client_id=appId
&response_type=code
&redirect_uri=https://jwt.ms
&response_mode=query
&scope=Calendars.Read
&state=12345
Когда вы войдете в личную учетную запись Microsoft, например почту Outlook, вы попадете на страницу login.live.com:
После успешной аутентификации значение code в адресной строке начинается с «M.C51» для таких учетных записей Outlook:
Теперь я использовал это code, чтобы получить токен доступа, используя поток кода авторизации через Postman с параметрами ниже, и получил такой ответ:
POST https://login.microsoftonline.com/common/oauth2/v2.0/token
grant_type:authorization_code
client_id:appId
client_secret:secret
scope:Calendars.Read
code:code
redirect_uri:https://jwt.ms
Ответ:
Когда я использовал этот токен для вызова API, я успешно получил ответ с такими событиями:
GET https://graph.microsoft.com/v1.0/me/events
Ответ:
не могли бы вы показать мне, где я могу найти appId?
Его можно найти на странице обзора регистрации приложения под названием «Идентификатор приложения (клиента)».
@NileshDaldra Рад узнать, что это сработало :)
я попытался войти в другую учетную запись, но мы получаем ошибку 1:. Ошибка: AADTS70000: запрос отклонен, поскольку одна или несколько запрошенных областей являются неавторизованными или срок их действия истек. Пользователь должен сначала войти в систему и предоставить клиентскому приложению доступ к запрошенной области. Идентификатор трассировки: 2082d941-8805-495f-b734-1bfe5bfde901 Идентификатор корреляции: f0932962-017c-474a-850d-3be2ccd52b6b Временная метка: 2024-06-11 13:32:09Z
@NileshDaldra Не могли бы вы добавить сюда изображение ошибки и более подробную информацию, например, какая область используется? Дали ли вы согласие администратора на добавленные делегированные разрешения?
Сейчас работает, это была проблема с типом гранта
там мне нужна помощь. для единого входа
Да, пожалуйста, опубликуйте новый вопрос с более подробной информацией и поделитесь ссылкой здесь.
@NileshDaldra Пожалуйста, добавьте тег Azure в этот вопрос и укажите здесь более подробную информацию о том, что именно вы подразумеваете под единым входом? Вы имеете в виду какие-либо блоги или документы? Пожалуйста, включите их тоже
@NileshDaldra Как вы генерируете токен доступа? Какой поток аутентификации вы сейчас используете?
Не могли бы вы рассказать, как вы сгенерировали токен доступа? Какой тип гранта вы использовали для получения токена?