首頁 > 後端開發 > php教程 > PHP主|了解Oauth-從頭開始推文,第1部分

PHP主|了解Oauth-從頭開始推文,第1部分

Lisa Kudrow
發布: 2025-03-02 08:39:10
原創
246 人瀏覽過

PHP Master | Understanding OAuth - Tweeting from Scratch, Part 1

核心要點

  • OAuth 就像一個“代客鑰匙”,允許 PHP 應用程序代表用戶發佈到 Twitter,而無需每次都輸入用戶名和密碼。應用程序是消費者,用戶是資源所有者,Twitter 是服務器或服務提供商。
  • 要在 Twitter 上發布信息,應用程序需要獲取自己的客戶端憑據:消費者密鑰和消費者密鑰。在應用程序完成註冊表單並提供其名稱、描述、網站 URL 和回調 URL 等信息後,Twitter 會授予這些憑據。
  • 消費者密鑰和消費者密鑰允許應用程序與 Twitter API 通信,但要代表用戶發布推文,它還需要訪問憑據:訪問令牌和訪問密鑰。這些是通過使用消費者憑據與 Twitter 和最終用戶進行對話獲得的。
  • 本文提供了一個詳細的分步指南,說明如何獲取這些憑據,包括生成請求憑據 URL 所需的代碼、如何根據字符串構建簽名以及如何創建請求訪問憑據的 URL。

許多人認為 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中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板