В настоящее время я использую PHP-EWS Проект, чтобы помочь автоматически регистрировать электронную почту из нескольких почтовых ящиков.
Система работала отлично, до недавнего времени я начал получать "The request failed with HTTP status 401: Unauthorized."
ошибка.
После обращения в Microsoft они сказали, что для аутентификации необходимо использовать знак вместо имени пользователя / пароля. Я наткнулся этот вопрос по user3434790, который, кажется, именно то, что я ищу, за исключением того, что я не уверен, как получить токен в первую очередь!
Я видел кое-что о методе Javascript, но мой скрипт полностью на стороне сервера (PHP), и я специально пытаюсь подключиться к учетным записям Office 365.
Хорошо, пока что проводим некоторые исследования, это в основном история из трех частей.
Первая часть касается получения «кода авторизации». По сути, это означает, что вы регистрируете свое приложение в Azure или Outlook 365 Dev, а затем у вас есть страница или проверка, чтобы проверить, есть ли у вас действительный «токен» для вашего пользователя. Если нет, тогда вам нужно получить этот токен.
По сути, это означает отправку вашего пользователя на страницу входа в домен Microsoft с вашим ClientID и URI обратного вызова (который вы зарегистрировали ранее) в URL-адресе, а также какие разрешения вы хотите. Затем пользователь войдет в систему и будет перенаправлен на ваш сайт с «Кодом авторизации», который вам нужен в URL. Это обобщенное руководство о том, как это сделать. Это касается не конкретного языка, а общего потока запросов.
Очень простой, и не будет использоваться в производстве, примером этого будет
index.php
if (!$_SESSION['code']) {
$redirect = 'https://login.microsoftonline.com/common/oauth2/v2.0/authorize' .
'?response_type=code' .
'&client_id=' . urlencode('clientId') .
'&redirect_uri=' . urlencode('https://localhost/callback.php') .
'&scope=' . urlencode('https://outlook.office365.com/Mail.Read')
;
header("Location: {$redirect}");
exit();
}
callback.php
if (isset($_GET['code'])) {
$_SESSION['code'] = $_GET['code'];
header("Location: index.php");
}
Часть вторая: получение токена авторизации
К сожалению, Кодекс не все, что вам нужно. Это быстрый одноразовый код, который вы используете для получения фактического токена, необходимого для авторизации ваших запросов. Вы можете сделать это, отправив сообщение «https://login.microsoftonline.com/common/oauth2/v2.0/token«со следующими данными
С Guzzle это можно сделать как таковое
$postOptions = array(
'http_errors' => false,
'form_params' => array(
'client_id' => $clientId,
'client_secret' => $clientSecret,
'code' => $authorizationCode,
'redirect_uri' => $redirectUri,
'grant_type' => 'authorization_code'
)
);
$url = 'https://login.microsoftonline.com/common/oauth2/v2.0/token';
$client = new Client();
$response = $client->request('POST', $url, $postOptions);
$response = $response->getBody()->__toString();
$response = json_decode($response);
return $response->access_token;
Получив свой токен, вы хотите сохранить его. Хотя код предназначен для одноразового использования, токен будет работать немного дольше. Судя по тому, что я видел, он истекает через час. Таким образом, вы хотите получить свой токен один раз, а затем сохранить его в своем сеансе или как хотите. Получив токен, вы сможете делать звонки. Ну, почти.
Часть третья: мыльные звонки
К сожалению, используемая вами библиотека вообще не поддерживает это. Он имеет жестко запрограммированную авторизацию как базовую аутентификацию HTTP или NTLM. Вы можете видеть, что нет возможности поддержки через токены. Вот. Если вы разветвляете его, вы можете удалить строки 78 и 79 и изменить ExchangeWebServices, чтобы вместо этого передавать токен, и вам просто нужно добавить
'Authorization: Bearer ' . $token
к заголовкам, и это должно работать. Или, если у вас есть время, вы можете попытаться использовать гораздо более обновленный форк той библиотеки, которую я пишу и поддерживаю, garethp / PHP-овости. Несмотря на то, что он не может позаботиться о Шаге 1 для вас, когда у вас есть код авторизации, он значительно облегчит Шаг 2 и 3. Вот маленький пример. Тем не менее, это новая функция, которую я только что вставил сегодня, и она все еще экспериментальная. Я столкнулся с проблемами с разрешениями, потому что похоже, что вам нужно зарегистрировать свое приложение в Azure AD для Office 365, чтобы получить правильные разрешения для EWS, вместо регистрации в Outlook, чтобы получить разрешения для API Outlook REST, и я могу некоторые проблемы при создании учетной записи для Azure. Таким образом, мне удалось добиться того, чтобы создать токен, авторизоваться с ним, удостовериться, что он пропускается, и получить сообщение о том, что у меня нет токена для выполнения того, что нужно сделать.
Других решений пока нет …