跳转到主要内容

授权请求

本文档旨在演示如何修改 HTTP 请求,以便向 X API 发送授权请求。 所有 X 的 API 都基于 HTTP 协议。这意味着,你编写的任何使用 X API 的软件都会向 X 的服务器发送一系列结构化消息。举例来说,作为一条 Tweet 发布文本“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.x.com

status=%E5%A5%B3%E5%A3%AB%E4%BB%A3%E8%A1%A8%EF%BC%8B%E5%85%88%E7%94%9F%E4%BB%A3%E8%A1%A8%EF%BC%8C%E5%B7%B2%E7%AD%BE%E5%90%8DOAuth%E7%9A%84%E8%AF%B7%E6%B1%82%EF%BC%81
任何 HTTP 库都应能较为容易地生成并发出上述请求。不过,上述请求被视为无效,因为无法确定:
  1. 是哪个应用在发出请求
  2. 该请求代表哪位用户发布内容
  3. 用户是否已授权该应用代其发布内容
  4. 该请求在传输过程中是否被第三方篡改
为使应用能够提供这些信息,X 的 API 采用 OAuth 1.0a 协议。在高度简化的层面上,X 的实现要求凡需授权的请求都包含一个额外的 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.x.com

status=Hello%20Ladies%20%2b%20Gentlemen%2c%20a%20signed%20OAuth%20request%21
当创建此请求时,X API 会将其视为有效请求。 如果此签名过程似乎超出了您的集成范围,请考虑使用 Web Intents,它无需使用 OAuth 即可与 X API 交互。   收集参数 您应该能够看到,该头部包含 7 个键/值对,其中所有键都以字符串“oauth_”开头。对于任何给定的 X API 请求,收集这些 7 个值并创建类似的头部将允许您为请求指定授权。每个值的生成方式在下面描述: 消费者密钥 oauth_consumer_key 标识发起请求的应用。从您在 开发者门户 中的 X 应用 的设置页面获取此值。
oauth_consumer_keyxvz1evFS4wEEPTGEFPHBog
Nonce oauth_nonce 参数是您的应用应为每个唯一请求生成的一个唯一令牌。X 将使用此值来确定请求是否已被多次提交。此请求的值是通过对 32 字节的随机数据进行 base64 编码,并去除所有非单词字符生成的,但任何能生成相对随机字母数字字符串的方法在这里都应该可行。
oauth_noncekYjzVBB8Y0ZFabxSWbWovY3uYSQ2pTgmZeNu2VS4cg
签名 参数 oauth_signature 包含一个通过将所有其他请求参数与两个密钥值一并输入签名算法而生成的值。签名用于使 X 能够验证请求在传输过程中未被篡改、确认发送请求的应用身份,并确认该应用已获授权与用户账户交互。 计算此请求的 oauth_signature 的过程见 创建签名
oauth_signaturetnnArxj06cWHq44gCs1OSKk/jLY=
签名方法 X 使用的 oauth_signature_method 为 HMAC-SHA1。发送到 X API 的任何已授权请求都应使用此值。
oauth_signature_methodHMAC-SHA1
时间戳 oauth_timestamp 参数表示请求创建的时间。该值应为生成请求时自 Unix 纪元以来的秒数,并且在大多数编程语言中都易于生成。X 会拒绝创建时间过早的请求,因此务必使生成请求的计算机时钟与 NTP 保持同步。
oauth_timestamp1318622958
令牌 oauth_token 参数通常表示用户授予你的应用访问其账户的权限。少数认证请求中该值不会传递或会采用不同形式的令牌,但这些情况在获取访问令牌中有详细说明。对于大多数通用请求,你将使用所谓的“访问令牌”。 你可以在开发者门户中你的 X 应用的设置页面为你的账户生成有效的访问令牌
oauth_token370773112-GmHxMAgYyLbNEtIKZeRNFsMKPR9EyMZeS9weJAEb
版本 oauth_version 参数对于发送到 X API 的任何请求应始终为 1.0。
oauth_version1.0

构建标头字符串

要构建标头字符串,可以设想将内容写入名为 DST 的字符串。
  1. 将字符串 “OAuth ”(包含末尾的空格)追加到 DST。
  2. 对于上面列出的 7 个参数中的每个键值对:
    1. 将键进行百分号编码并追加到 DST。
    2. 将等号字符 ‘=’ 追加到 DST。
    3. 将双引号 ‘”’ 追加到 DST。
    4. 将值进行百分号编码并追加到 DST。
    5. 将双引号 ‘”’ 追加到 DST。
    6. 如果仍有剩余的键值对,则将逗号 ‘,’ 和空格 ‘ ’ 追加到 DST。
在构建此字符串时,需特别注意对值进行百分号编码。例如,oauth_signature 的值 tnnArxj06cWHq44gCs1OSKk/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 标头。