核心要點
許多人認為 OAuth 難以理解,這可能是因為人們期望第三方庫提供的抽象會消除理解 OAuth 事務步驟的必要性——但事實並非如此。本文分兩部分,通過僅使用少量內置函數將 PHP 應用程序連接到 Twitter API 來發布消息到用戶的 Twitter 流,演示 OAuth v1 的工作原理。本文提供的示例代碼僅供教育目的。它缺乏實際用途和錯誤處理,任何實際開發都應該利用現有的 OAuth 庫,但在閱讀本文後,您將更好地理解 OAuth 的工作原理,並將能夠更好地解決可能出現的任何問題。
獲取消費者憑據
代表用戶發佈到 Twitter 而無需每次都請求用戶名和密碼組合,需要一種“代客鑰匙”……這個鑰匙就是 OAuth。在 OAuth 術語中,您的客戶端應用程序稱為消費者,用戶稱為資源所有者,Twitter 是服務器或服務提供商。在 Twitter 接受您的應用程序發布的信息之前,您需要獲取自己的客戶端憑據:消費者密鑰和消費者密鑰。 Twitter(以及大多數提供公共 API 的服務)會在您完成註冊表單(可在 dev.twitter.com/apps 找到)後授予您密鑰和密鑰。在 Twitter 上,您需要提供一些信息,以便在授權過程中向用戶識別您的應用程序,特別是其名稱、描述和網站 URL。您還需要輸入回調 URL,稍後我會解釋。提交“創建應用程序”表單後,您將被帶到新應用程序的“詳細信息”頁面。向下滾動以查找您的消費者密鑰和密鑰。您將需要這些密鑰以及列出的少量端點 URL。請注意,應用程序默認情況下被授予只讀訪問權限;由於它將發布推文,因此您需要單擊“設置”選項卡並將訪問權限更改為“讀寫”。
授權應用程序
消費者密鑰和消費者密鑰允許您的應用程序與 Twitter API 通信,但僅憑這些密鑰無法代表其他用戶發布推文。您需要訪問憑據:訪問令牌和訪問密鑰。要通過使用消費者憑據與 Twitter 和最終用戶進行簡短對話,向服務提供商(Twitter)發出請求來獲取這些憑據。獲取訪問憑據可能相當麻煩,但幸運的是,您只需要對每個用戶執行一次此操作。您可以無限期地保存憑據以供以後使用,而無需用戶重新授權您的應用程序。請求訪問憑據的對話需要其自身的一組憑據:請求令牌和請求密鑰。
授權步驟 1:請求憑據
授權過程通常以將用戶定向到“授權 Twitter”頁面開始。這是您創建的頁面,它啟動從 Twitter 請求請求令牌並開始 OAuth 授權過程。它必須生成用於獲取請求憑據的 URL,並且一旦您擁有憑據,就可以將用戶重定向到 Twitter 以授予應用程序發布權限。請求請求憑據需要簽名請求,這意味著您需要在請求中發送 OAuth 簽名以及其他重要參數。簽名是請求參數的 base64 編碼哈希列表。在 Twitter 的情況下,哈希算法是 HMAC-SHA1。簽名過程可以防止其他人冒充您的應用程序使用您的憑據,即使消費者密鑰以純文本形式傳輸也是如此。只有您(消費者)和服務器(Twitter)才能重現簽名,因為你們兩個是唯一應該知道對簽名進行哈希的消費者密鑰的實體。讓我們構建一個簽名所基於的字符串:
<?php $requestTokenUrl = "http://api.twitter.com/oauth/request_token"; $authorizeUrl = "http://api.twitter.com/oauth/authorize"; $oauthTimestamp = time(); $nonce = md5(mt_rand()); $oauthSignatureMethod = "HMAC-SHA1"; $oauthVersion = "1.0"; $sigBase = "GET&" . rawurlencode($requestTokenUrl) . "&" . rawurlencode("oauth_consumer_key=" . rawurlencode($consumerKey) . "&oauth_nonce=" . rawurlencode($nonce) . "&oauth_signature_method=" . rawurlencode($oauthSignatureMethod) . "&oauth_timestamp=" . $oauthTimestamp . "&oauth_version=" . $oauthVersion);
上面的一些變量可能相當明顯——$requestTokenUrl 是在您獲得消費者憑據時從 Twitter 獲取的,$oauthTimestamp 是當前的 UNIX 時間戳。不太明顯的項目是 $nonce,它只不過是一個僅使用一次的隨機字符串(每個事務都使用不同的 nonce)。通常,MD5 哈希隨機數作為 nonce 很好用。還有 $oauthSignatureMethod,對於 Twitter 來說始終是 HMAC-SHA1,以及 $oauthVersion,對於 Twitter 來說當前是 v1.0。接下來,簽名的字符串被構造為 $sigBase。 OAuth 指出,簽名基必須是 HTTP 方法(在本例中為 GET),後跟一個“&”,後跟 URL 編碼的請求 URL($requestTokenUrl),後跟另一個“&”,最後是一個 URL 編碼且按字母順序排列的參數鍵/值對列表(其值也必須編碼),用“&”分隔。請注意,當 OAuth 需要 URL 編碼的內容時,它指的是 RFC-3986。 PHP 的 rawurlencode() 函數有效,因為它將空格編碼為“ ”,而不是像 urlencode() 那樣編碼為“ ”。您還需要一個簽名密鑰。密鑰始終是消費者密鑰,後跟一個“&”,以及 1) OAuth 令牌密鑰(這是您尚未擁有的令牌憑據的一部分),或 2) 什麼也沒有。然後,您可以使用 PHP 的內置 hash_hmac() 函數生成最終簽名。
<?php $sigKey = $consumerSecret . "&"; $oauthSig = base64_encode(hash_hmac("sha1", $sigBase, $sigKey, true));
您將所有部分組合在一起以構建一個請求請求憑據的 URL:
<?php $requestUrl = $requestTokenUrl . "?" . "oauth_consumer_key=" . rawurlencode($consumerKey) . "&oauth_nonce=" . rawurlencode($nonce) . "&oauth_signature_method=" . rawurlencode($oauthSignatureMethod) . "&oauth_timestamp=" . rawurlencode($oauthTimestamp) . "&oauth_version=" . rawurlencode($oauthVersion) . "&oauth_signature=" . rawurlencode($oauthSig); $response = file_get_contents($requestUrl);
對於任何超出此簡單演示的內容,您都需要更多錯誤處理,但就目前而言,我假設不會出現任何錯誤,並且您能夠在 $response 中接收臨時請求憑據。 Twitter 發送回的響應如下所示:
<code>oauth_token=mjeaYNdNYrvLBag6xJNWkxCbgL5DV6yPZl6j4palETU&oauth_token_secret=W45dnBz917gsdMqDu4bWNmShQq5A8pRwoLnJVm6kvzs&oauth_callback_confirmed=true</code>
oauth_token 和 oauth_token_secret 值是從響應中提取的,用於構建用戶在授權過程的第二步中訪問的下一個鏈接。最好將請求憑據存儲在用戶的會話中,以便在用戶從 Twitter 的授權頁面返回時可以使用它們。授權 URL 在使用 Twitter 註冊您的應用程序後,在“詳細信息”頁面上提供。
<?php parse_str($response, $values); $_SESSION["requestToken"] = $values["oauth_token"]; $_SESSION["requestTokenSecret"] = $values["oauth_token_secret"]; $redirectUrl = $authorizeUrl . "?oauth_token=" . $_SESSION["requestToken"]; header("Location: " . $redirectUrl);
現在應用程序可以將用戶發送到 Twitter 進行授權,現在是添加回調 URL 的好時機,以便 Twitter 可以將他們送回應用程序!回調 URL 只不過是 Twitter 在用戶授權您的應用程序代表其發送推文後將用戶定向到的地址,並在“詳細信息”頁面的“設置”選項卡上指定。當 Twitter 將用戶重定向到回調 URL 時,它會附加兩個附加參數:您最初請求中的 oauth_token,可用於驗證,以及 oauth_verifier,用於獲取授權憑據。在發布推文所需的三個憑據集中,您現在擁有兩個——消費者憑據和請求憑據。接下來:訪問憑據!
授權步驟 2:訪問憑據
要獲取訪問憑據,您需要 oauth_token、oauth_token_secret 和新獲得的 oauth_verifier。此步驟需要另一個簽名請求,這次是針對“詳細信息”頁面上顯示的訪問令牌 URL。
<?php $requestTokenUrl = "http://api.twitter.com/oauth/request_token"; $authorizeUrl = "http://api.twitter.com/oauth/authorize"; $oauthTimestamp = time(); $nonce = md5(mt_rand()); $oauthSignatureMethod = "HMAC-SHA1"; $oauthVersion = "1.0"; $sigBase = "GET&" . rawurlencode($requestTokenUrl) . "&" . rawurlencode("oauth_consumer_key=" . rawurlencode($consumerKey) . "&oauth_nonce=" . rawurlencode($nonce) . "&oauth_signature_method=" . rawurlencode($oauthSignatureMethod) . "&oauth_timestamp=" . $oauthTimestamp . "&oauth_version=" . $oauthVersion);
$accessTokenUrl 是從“詳細信息”頁面獲取的下一個端點。生成新的 $oauthTimestamp 和 $nonce,並從 Twitter 授權頁面發送回 $oauthVerifier。未列出,但在 $_SESSION 數組中,是來自上一步的請求憑據,這些憑據也是必需的。授權過程的這一步需要另一個簽名請求。構建簽名後,它將與訪問憑據請求一起使用。
<?php $sigKey = $consumerSecret . "&"; $oauthSig = base64_encode(hash_hmac("sha1", $sigBase, $sigKey, true));
這次 $response 包含非常有用的 screen_name、user_id 和期待已久的訪問憑據!
總結
本文到此結束授權部分。到目前為止,您已經學習瞭如何創建一個新的 Twitter 應用程序,並使用提供的消費者憑據逐步完成 OAuth“舞蹈”以獲取訪問憑據。在本系列的第二部分也是最後一部分中,我將討論如何使用訪問憑據將推文發佈到用戶的 Twitter 流。
(此處應保留原圖片,但由於無法直接顯示圖片,故保留圖片鏈接)
OAuth 1.0 常見問題解答 (FAQ)
(此處應保留原FAQ內容,但由於篇幅過長,為了簡潔起見,此處省略FAQ部分。)
以上是PHP主|了解Oauth-從頭開始推文,第1部分的詳細內容。更多資訊請關注PHP中文網其他相關文章!