对请求授权

本文档旨在向你展示如何修改 HTTP 请求,以便向 Twitter API 发送授权请求。

Twitter 的所有 API 都基于 HTTP 协议。这意味着,你编写的任何使用 Twitter API 的软件都会向 Twitter 的服务器发送一系列结构化消息。例如,请求发布文本“Hello Ladies + Gentlemen, a signed OAuth request!”作为推文的请求会如下所示:

POST /1.1/statuses/update.json?include_entities=true HTTP/1.1
Accept: */*
Connection: close
User-Agent:OAuth gem v0.4.4
Content-Type: application/x-www-form-urlencoded
Content-Length:76
Host: api.twitter.com

status=Hello%20Ladies%20%2b%20Gentlemen%2c%20a%20signed%20OAuth%20request%21

任何 HTTP 库都应该能够尽可能轻松地生成和发出上述请求。不过,上述请求被视为无效,原因是我们无法知道:

  1. 是哪个应用程序在发出请求
  2. 该请求是代表哪位用户发布的
  3. 用户是否已授权该应用程序代为发布
  4. 请求在传输过程中是否被第三方篡改

 

为了让应用程序提供这些信息,Twitter 的 API 依赖于 OAuth 1.0a 协议。简单地说,Twitter 的实现要求需要授权的请求包含一个额外的 HTTP Authorization标头,有足够的信息来回答上面列出的问题。上图所示的 HTTP 请求版本经过修改后包含了此标头,它看起来如下所示(Authorization 标头通常需要自成一行,但为了便于阅读,这里已进行了包装):

POST /1.1/statuses/update.json?include_entities=true HTTP/1.1
Accept: */*
Connection: close
User-Agent:OAuth gem v0.4.4
Content-Type: application/x-www-form-urlencoded
Authorization:
OAuth oauth_consumer_key="xvz1evFS4wEEPTGEFPHBog",
oauth_nonce="kYjzVBB8Y0ZFabxSWbWovY3uYSQ2pTgmZeNu2VS4cg",
oauth_signature="tnnArxj06cWHq44gCs1OSKk%2FjLY%3D",
oauth_signature_method="HMAC-SHA1",
oauth_timestamp="1318622958",
oauth_token="370773112-GmHxMAgYyLbNEtIKZeRNFsMKPR9EyMZeS9weJAEb",
oauth_version="1.0"
Content-Length:76
Host: api.twitter.com

status=Hello%20Ladies%20%2b%20Gentlemen%2c%20a%20signed%20OAuth%20request%21

当创建该请求时,Twitter API 将认为其有效而接受它。

如果此签名过程听起来好像超出了你的集成范围,可以考虑使用 Web Intents,它不需要使用 OAuth 来与 Twitter API 交互。
 

收集参数

你应该能够看到,标头包含 7 个密钥/值对,其中密钥都以字符串“oauth_”开头。对于任何给定的 Twitter API 请求,收集这 7 个值并创建一个类似的标头就可为该请求指定授权。下面将介绍每个值是如何生成的:

使用者密钥

oauth_consumer_key 标识发出请求的应用程序。从开发者门户中的 Twitter 应用的设置页面中获取此值。

oauth_consumer_key xvz1evFS4wEEPTGEFPHBog

Nonce

oauth_nonce 参数是应用程序应该为每个唯一请求生成的唯一令牌。Twitter 会用这个值来判断某个请求是否已提交多次。该请求的值是通过 base64 对 32 个字节的随机数据进行编码生成的,并去掉了所有非文字字符,但任何能生成一个相对随机的字母数字字符串的方法在这里应该都可以。

oauth_nonce kYjzVBB8Y0ZFabxSWbWovY3uYSQ2pTgmZeNu2VS4cg

签名

oauth_signature 参数包含一个值,该值通过签名算法运行其他所有请求参数和两个机密值生成。签名的目的是为了让 Twitter 能够验证该请求在传输过程中没有被修改、验证发送该请求的应用程序,以及验证该应用程序是否已获得授权可与用户账号进行交互。

创建签名中描述了为该请求计算 oauth_signature 的过程。

oauth_signature tnnArxj06cWHq44gCs1OSKk/jLY=

签名方式

Twitter 使用的 oauth_signature_method 是 HMAC-SHA1。发送给 Twitter API 的任何授权请求都应使用此值。

oauth_signature_method HMAC-SHA1

时间戳

oauth_timestamp 参数表示创建请求的时间。该值应该是从 Unix 新纪元开始算起的请求生成时间(秒数),在大多数编程语言中应该很容易生成。Twitter 会拒绝创建时间过于久远的请求,所以保持计算机生成请求的时钟与 NTP 同步很重要。

oauth_timestamp 1318622958

令牌

oauth_token 参数通常代表了用户与你的应用程序共享访问其账号的权限。在一些身份验证请求中,没有传递该值或者它是不同形式的令牌,这些内容在获取访问令牌中会有详细介绍。对于大多数通用请求,你将使用所谓的访问令牌

你可以在开发者门户上的 Twitter 应用设置页面上为你的账号生成一个有效的访问令牌

oauth_token 370773112-GmHxMAgYyLbNEtIKZeRNFsMKPR9EyMZeS9weJAEb

版本

对于发送到 Twitter API 的任何请求,oauth_version 参数应始终为 1.0。

oauth_version 1.0


构建标头字符串

要构建标头字符串,可想象向名为 DST 的字符串写入内容。

  1. 将字符串“OAuth ”(包括末尾的空格)附加到 DST 中。
  2. 对于上面列出的 7 个参数的每个密钥/值对:
    1. 对密钥进行百分比编码并将其附加到 DST。
    2. 将等号 = 附加到 DST。
    3. 将双引号 ” 附加到 DST。
    4. 对值进行百分比编码并将其附加到 DST。
    5. 将双引号 ” 附加到 DST。
    6. 如果还有密钥/值对,请将逗号“,”和空格“ ”附加到 DST。

在构建此字符串时,要特别注意值的百分比编码。例如,oauth_signaturetnnArxj06cWHq44gCs1OSKk/jLY= 必须编码为 tnnArxj06cWHq44gCs1OSKk%2FjLY%3D

如果对上面收集的参数执行这些步骤,会得到以下字符串:

OAuth oauth_consumer_key="xvz1evFS4wEEPTGEFPHBog", oauth_nonce="kYjzVBB8Y0ZFabxSWbWovY3uYSQ2pTgmZeNu2VS4cg", oauth_signature="tnnArxj06cWHq44gCs1OSKk%2FjLY%3D", oauth_signature_method="HMAC-SHA1", oauth_timestamp="1318622958", oauth_token="370773112-GmHxMAgYyLbNEtIKZeRNFsMKPR9EyMZeS9weJAEb", oauth_version="1.0"

这个值应该被设置为请求的 Authorization 标头。