好的,到目前爲止進行一些研究這基本上是一個故事,分爲三部分。
第一部分是關於獲取「授權碼」。基本上,這意味着您使用Azure或Outlook 365 Dev註冊您的應用程序,然後有一個頁面或一張支票來查看您的用戶是否擁有有效的「令牌」。如果你不這樣做,那麼你需要得到那個令牌。
基本上,這意味着將您的用戶以您的ClientID和Callback URI(之前註冊過的URL)發送到Microsoft域中的登錄頁面,以及您想要的權限。然後,用戶將登錄並通過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
- 交付式
隨着狂飲做到這一點,可以這樣做
$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的硬編碼授權。您可以看到沒有通過令牌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的開發人員帳戶時遇到一些問題。所以我設法創建了一個令牌,並對它進行授權,確保它只是被告知我所擁有的令牌沒有權限去做需要做的事情。
如果您僅針對Office 365,那麼您是否看過Outlook REST API?在PHP中使用它們會更容易 - 請參閱https://dev.outlook.com/RestGettingStarted/Tutorial/php –
謝謝Venkat。我已經看到了Outlook REST API,但是我希望避開它(除非它是唯一的方式) - 因爲我在使用SOAP-CURL之前已經使系統工作。 – jtcrow
@jtcrow不幸的是,你鏈接到的php-ews庫不支持令牌,它只支持用戶名和密碼。它也沒有維護,所以不會很快加入。我有我自己的叫做garethp/php-ews的分支,我會在接下來的幾周內添加Token支持,但目前你無法在該庫中使用令牌不要自己動手 –