2015-11-19 32 views
3

我目前使用PHP-EWS項目來幫助自動記錄來自多個郵箱的郵件。 系統工作良好,直到最近我開始出現"The request failed with HTTP status 401: Unauthorized."錯誤。PHP EWS創建回調令牌

與Microsoft聯繫後,他們表示可能需要使用令牌代替用戶名/密碼。我遇到this question由user3434790這似乎正是我正在尋找,除了我不知道如何獲得令牌的第一位! 我已經看到了一些Javascript方法,但我的腳本完全是服務器端(PHP),我特別試圖連接到Office 365帳戶。

+0

如果您僅針對Office 365,那麼您是否看過Outlook REST API?在PHP中使用它們會更容易 - 請參閱https://dev.outlook.com/RestGettingStarted/Tutorial/php –

+0

謝謝Venkat。我已經看到了Outlook REST API,但是我希望避開它(除非它是唯一的方式) - 因爲我在使用SOAP-CURL之前已經使系統工作。 – jtcrow

+0

@jtcrow不幸的是,你鏈接到的php-ews庫不支持令牌,它只支持用戶名和密碼。它也沒有維護,所以不會很快加入。我有我自己的叫做garethp/php-ews的分支,我會在接下來的幾周內添加Token支持,但目前你無法在該庫中使用令牌不要自己動手 –

回答

1

好的,到目前爲止進行一些研究這基本上是一個故事,分爲三部分。

第一部分是關於獲取「授權碼」。基本上,這意味着您使用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的開發人員帳戶時遇到一些問題。所以我設法創建了一個令牌,並對它進行授權,確保它只是被告知我所擁有的令牌沒有權限去做需要做的事情。

+0

這真是太棒了,謝謝Gareth--你已經在很多細節中解釋過了,我也很感激!我將會對我的更新進行處理,並讓您知道我的進度! – jtcrow

+0

@jtcrow我剛剛發現這篇文章,它對理解獲取令牌的一般流程比我迄今閱讀的任何內容都更有幫助。可能值得加書籤參考。 https://msdn.microsoft.com/en-us/office/office365/howto/authentication-v2-protocols –