跳转到主要内容

授权请求

本文档旨在说明如何修改 HTTP 请求,以便向 X API 发送已授权的请求。 所有 X 的 API 都基于 HTTP 协议。这意味着您编写的任何使用 X API 的软件都会向 X 的服务器发送一系列结构化消息。比如,将文本“Hello Ladies + Gentlemen, a signed OAuth request!”作为一条 Tweet 发布的请求看起来大致如下:
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=Hello%20Ladies%20%2b%20Gentlemen%2c%20a%20signed%20OAuth%20request%21
任何 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,它与 X API 交互时无需使用 OAuth。   收集参数 你应当能看到请求头包含 7 个键值对,这些键都以字符串“oauth_”开头。对于任一 X API 请求,收集这 7 个值并构造类似的请求头即可为该请求指定授权。各值的生成方式如下所述: Consumer key oauth_consumer_key 用于标识发出请求的应用程序。请在 开发者门户 中你的 X app 的设置页面获取该值。
oauth_consumer_keyxvz1evFS4wEEPTGEFPHBog
Nonce oauth_nonce 参数是你的应用程序应为每个唯一请求生成的唯一令牌。X 会使用该值判断某个请求是否被重复提交。此请求的该值是通过对 32 字节的随机数据进行 base64 编码,并去除所有非单词字符生成的;但任何能产生相对随机的字母数字字符串的方法都可以接受。
oauth_noncekYjzVBB8Y0ZFabxSWbWovY3uYSQ2pTgmZeNu2VS4cg
Signature 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 参数通常表示用户授权你的应用允许访问其账户。在少数认证请求中,此值不会传递或会采用不同形式的令牌,相关情况在获取访问令牌中有详细说明。对于大多数通用请求,你将使用所谓的access token 你可以在开发者门户中你的 X App 的设置页面为你的账户生成有效的access token
oauth_token370773112-GmHxMAgYyLbNEtIKZeRNFsMKPR9EyMZeS9weJAEb
版本 对于发送到 X API 的任何请求,oauth_version 参数应始终为 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 标头。
I