Javascript PHP EWS创建回调令牌
我目前使用该项目帮助自动记录来自多个邮箱的电子邮件。 系统工作得很好,直到最近我开始收到一个Javascript PHP EWS创建回调令牌,javascript,php,office365,exchangewebservices,php-ews,Javascript,Php,Office365,Exchangewebservices,Php Ews,我目前使用该项目帮助自动记录来自多个邮箱的电子邮件。 系统工作得很好,直到最近我开始收到一个“请求失败,HTTP状态为401:Unauthorized。”错误 在联系微软后,他们说可能是身份验证需要使用令牌而不是用户名/密码。我遇到了用户34790,这似乎正是我正在寻找的,除了我不知道如何获得令牌在第一位! 我已经看过一些关于Javascript方法的内容,但是我的脚本完全是服务器端(PHP),我特别尝试连接到office 365帐户。好的,到目前为止,做一些研究这基本上是一个分为三部分的故事
“请求失败,HTTP状态为401:Unauthorized。”
错误
在联系微软后,他们说可能是身份验证需要使用令牌而不是用户名/密码。我遇到了用户34790,这似乎正是我正在寻找的,除了我不知道如何获得令牌在第一位!
我已经看过一些关于Javascript方法的内容,但是我的脚本完全是服务器端(PHP),我特别尝试连接到office 365帐户。好的,到目前为止,做一些研究这基本上是一个分为三部分的故事 第一部分是关于获取“授权码”。基本上,这意味着您要向Azure或Outlook 365 Dev注册应用程序,然后查看页面或检查是否有有效的用户“令牌”。如果你没有,那么你需要得到那个代币 基本上,这意味着将您的用户发送到Microsoft域上的登录页面,并在URL中包含您的ClientID和回调URI(您以前注册过),以及您想要的权限。然后,用户将登录并使用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");
}
第二部分:获取授权令牌
不幸的是,代码并不是您所需要的全部。这是一个快速的一次性代码,用于获取授权请求所需的实际令牌。您可以通过使用以下数据过帐到“”来完成此操作
- 客户端ID
- 客户机密
- 授权码
- 重定向URI
- 赠款类型
$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;
一旦你有了你的代币,你想保留这个。虽然代码是一次性的,但令牌将持续更长的时间。据我所见,一个小时后它似乎就要过期了。因此,您希望获得令牌一次,然后将其存储在会话中,或者以您希望的方式存储。一旦你有了代币,你就可以打电话了。嗯,差不多了
第三部分:Soap调用
不幸的是,您正在使用的库根本不支持这一点。它具有硬编码授权,可以是基本的HTTP身份验证,也可以是NTLM。您可以看到,没有通过令牌支持的选项。如果您使用fork,您可以删除第78行和第79行,并将ExchangeWebServices改为传递令牌,您只需添加
'Authorization: Bearer ' . $token
到标题,这应该会起作用。或者,如果您有时间,您可以尝试使用我编写和维护的库中更新得多的fork。虽然它不能为您完成步骤1,但一旦您获得了授权代码,它将使步骤2和步骤3更加容易。一个小例子。然而,这是我今天刚刚加入的一个新特性,它仍然是实验性的。我遇到了权限问题,因为看起来您需要向Azure AD for Office 365注册您的应用程序以获得EWS的正确权限,而不是向Outlook注册以获得Outlook REST API的权限,并且我可能会在为Azure创建开发帐户时遇到一些麻烦。因此,我设法创建了一个令牌,使用它进行了授权,确保它被传递,但却被告知我拥有的令牌没有权限执行需要执行的操作。如果您只针对Office 365,是否查看了Outlook REST API?将它们与PHP一起使用会容易得多-请参阅Thanke Venkat。我看过Outlook REST API,但我希望避开它(除非这是唯一的方法)——因为在使用SOAP-CURL之前,我已经让系统工作了。@很遗憾,您链接到的php ews库不支持令牌,它只支持用户名和密码。它也是未维护的,所以不会很快添加。我有自己的分支,名为garethp/php-ews,我希望在未来几周的某个时候添加令牌支持,但目前,如果您不自己分支,您将无法在该库中使用令牌,这太棒了,谢谢Gareth-您已经详细解释了它,我也非常感谢!我会努力更新,让你知道我的进展@我刚刚发现这篇文章,它比我迄今为止读过的任何文章都更有助于理解获取令牌的一般流程。可能值得作为参考书签。