javascript - PHP EWS 创建回调 token

标签 javascript php office365 exchangewebservices php-ews

我目前使用 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/

相关文章:

javascript - Jquery 过滤器不适用于 jquery 对象

php - 正则表达式数组与字符串问题

php - 在 Kohana 中,你能触发 404 错误吗?

php - PHP 中的 Office 365 API

office365 - 550 5.7.1客户端无权以该发送者的身份发送(office365)

php - 使用 PhoneGap 发送 PHP 表单

javascript - 使用 Angular UI Router,如何使一个状态成为所有状态的子状态?

java - Office 365 EWS 日历访问给予 ErrorTooManyObjectsOpened

office365 - Microsoft Graph : List all users and their groups in one request

javascript - jquery 获取JSON IP