我目前使用 PHP-EWS帮助自动记录来自多个邮箱的电子邮件的项目。
该系统运行良好,直到最近我开始收到 "The request failed with HTTP status 401: Unauthorized."
错误。
联系微软后,他们说可能是认证需要使用token,而不是用户名/密码。我遇到了this question由 user3434790 提供,这似乎正是我要找的,除了我不确定如何首先获取 token ! 我已经看到一些关于 Javascript 方法的信息,但我的脚本完全是服务器端 (PHP),我专门尝试连接到 Office 365 帐户。
最佳答案
好的,到目前为止,做一些研究这基本上是一个分为三个部分的故事。
第一部分是关于获取“授权码”。基本上这意味着您向 Azure 或 Outlook 365 Dev 注册您的应用程序,然后有一个页面或检查您的用户是否有有效的“ token ”。如果您不这样做,那么您需要获取该 token 。
基本上,这意味着将您的用户发送到 Microsoft Domain 上的登录页面,URL 中包含您的 ClientID 和回调 URI(您之前注册的),以及您想要的权限。然后,用户将使用您在 URL 中需要的“授权码”登录并被引导回您的站点。 This is a generalized guide on how to do it .它不处理特定的语言,而是处理请求的一般流程。
一个非常简单的,不用于生产的例子是
索引.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();
}
回调.php
if (isset($_GET['code'])) {
$_SESSION['code'] = $_GET['code'];
header("Location: index.php");
}
第二部分:获取授权 token
不幸的是,代码并不是您所需要的全部。这是一个快速的一次性代码,您可以使用它来获取授权您的请求所需的实际 token 。您可以通过使用以下数据发布到“https://login.microsoftonline.com/common/oauth2/v2.0/token”来执行此操作
- 客户编号
- 客户 secret
- 授权码
- 重定向 URI
- 资助类型
使用 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;
获得 token 后,您想保留它。虽然代码是一次性的,但 token 会持续更长时间。据我所见,它似乎在一小时后过期。所以你想获得你的 token 一次,然后将它存储在你的 session 中,或者你想存储它。获得 token 后,您就可以调用电话。嗯,差不多。
第三部分:肥皂电话
很遗憾,您使用的库根本不支持这一点。它具有作为基本 HTTP 身份验证或 NTLM 的硬编码授权。您可以看到没有通过 token 支持的选项 here .如果你 fork 它,你可以删除第 78 和 79 行并更改 ExchangeWebServices 以传递一个 token ,你只需要添加
'Authorization: Bearer ' . $token
到标题,这应该有效。或者,如果你有时间,你可以尝试使用我编写和维护的那个库的更新得多的分支,garethp/php-ews .虽然它无法为您处理第 1 步,但一旦您获得授权码,它将使第 2 步和第 3 步变得容易得多。 Here's一个小例子。但是,这是我今天刚加入的新功能,它仍处于试验阶段。我遇到了权限问题,因为看起来您需要向 Office 365 的 Azure AD 注册您的应用程序以获得 EWS 的正确权限,而不是向 Outlook 注册以获取 Outlook REST API 的权限,我可以进入为 Azure 创建开发帐户时遇到一些问题。所以我设法创建了一个 token ,用它授权,确保它被传递只是为了被告知我拥有的 token 没有权限做需要做的事情。
关于javascript - PHP EWS 创建回调 token ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33809508/