PHP EWS创建回调令牌

时间:2015-11-19 16:36:21

标签: javascript php office365 exchangewebservices php-ews

我目前使用PHP-EWS项目来帮助自动记录来自多个邮箱的电子邮件。 该系统运行良好,直到最近我才开始出现"The request failed with HTTP status 401: Unauthorized."错误。

与微软联系后,他们表示认证可能需要使用令牌而不是用户名/密码。我通过user3434790遇到了this question,这看起来正是我正在寻找的,除了我不知道如何首先获取令牌! 我看过一些关于Javascript方法的内容,但我的脚本完全是服务器端(PHP),我特意尝试连接到Office 365帐户。

1 个答案:

答案 0 :(得分:1)

好的,到目前为止做了一些研究,这基本上是一个三个部分的故事。

第一部分是关于获得“授权代码”。基本上这意味着您使用Azure或Outlook 365 Dev注册应用程序,然后使用页面或检查以查看您的用户是否拥有有效的“令牌”。如果你不这样做,那么你需要获得该令牌。

基本上,它意味着将您的用户发送到Microsoft域上的登录页面,其中包含您在URL中的ClientID和回调URI(您之前注册的),以及您想要的权限。然后,用户将使用URL中所需的“授权码”登录并返回到您的站点。 This is a generalized guide on how to do it。它不涉及特定语言,而是处理请求的一般流程。

非常简单,并且不会在生产中使用,例如

的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”来执行此操作

  • 客户ID
  • 客户端秘密
  • 授权码
  • 重定向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;

获得令牌后,您需要保留此令牌。虽然代码是一次性使用的东西,但令牌会持续一段时间。从我看到它似乎在一小时后过期。因此,您希望获取一次令牌,然后将其存储在您的会话中,或者您希望存储它。获得令牌后,您就可以拨打电话。好吧,差不多。

第三部分:肥皂呼唤

不幸的是,你使用的库根本不支持这个。它具有基本HTTP身份验证或NTLM的硬编码授权。您可以看到没有通过令牌here支持的选项。如果你分叉它,你可以删除第78行和第79行并改变ExchangeWebServices来代替传递令牌,你只需要添加

'Authorization: Bearer ' . $token

到标题,这应该工作。或者,如果您有时间,您可以尝试使用我编写和维护的库的更新更新的分支garethp/php-ews。虽然它无法为您处理第1步,但一旦您拥有了授权码,它将使第2步和第3步变得更加容易。 Here's一个小例子。然而,这是我今天刚刚提出的一个新功能,它仍然是实验性的。我遇到了权限问题,因为看起来您需要在Azure AD for Office 365中注册您的应用程序才能获得EWS的正确权限,而不是注册Outlook以获取Outlook REST API的权限,我可以进入为Azure创建开发帐户有些麻烦。所以我设法得到了一个令牌,用它进行授权,确保它被传递只是被告知我拥有的令牌没有权限做必要的事情。