核心要点
许多人认为 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中文网其他相关文章!