跳转到主要内容

OAuth Echo

OAuth Echo 是一种在与 API 交互时,将 OAuth 授权安全地委托给第三方的方式。 此交互涉及四方:
  • 用户(User):通过某个已授权的 X 应用使用 X
  • 消费者(Consumer):尝试与第三方媒体提供方(例如照片分享网站)交互的 X 应用
  • 委托方(Delegator):第三方媒体提供方
  • 服务提供方(Service Provider):即 X 本身  
本质上,需要准备一个请求,供委托方代表某个应用和用户发送至 X API。将原本应签名的 OAuth 请求放入 HTTP 头中,在完成中间操作后请委托方将该请求发送给 X。 举例:用户想上传一张照片。消费者将通过 POST 调用委托方的上传接口。该 POST 应包含图像,还需要在 HTTP 头中包含两个额外字段:
  • x-auth-service-provider — 实际上,这是进行身份委托的目标域(realm)。对于 X,将其设置为 https://api.x.com/1.1/account/verify_credentials.json。基于 iOS5 的 X 集成会在此 URL 中添加一个额外的 application_id 参数,该参数也将用于计算在 x-verify-credentials-authorization 中使用的 oauth_signature。
  • x-verify-credentials-authorization — 消费者应创建所有必要的 OAuth 参数,以便它可以在 HTTP 头中使用 OAuth 调用 https://api.x.com/1.1/account/verify_credentials.json(例如,形如 OAuth oauth_consumer_key=”…”, oauth_token=”…”, oauth_signature_method=”…”, oauth_signature=”…”, oauth_timestamp=”…”, oauth_nonce=”…”, oauth_version=”…”)。  
请注意,整个交易需要在 oauth_timestamp 仍有效的时间窗口内完成。 或者,可以不在头中发送这两个参数,而是在 POST 体中以 x_auth_service_provider 和 x_verify_credentials_authorization 形式发送——在这种情况下,请记得对参数进行转义,并将其包含到 OAuth 签名基字符串中——类似于对任何请求参数的编码。为尽可能将操作解耦,最佳做法是使用 HTTP 头。 此时,委托方(Delegator)的目标是在保存媒体之前验证用户身份的真实性。委托方通过其上传方法接收到上述所有 data 后,应先临时存储图像,然后根据 x-auth-service-provider 头中指定的端点发起调用——在此示例中为 https://api.x.com/1.1/account/verify_credentials.json,并使用消费者在 x-verify-credentials-authorization 头中提供的相同 OAuth 认证头。  

OAuth Echo 最佳实践

使用 x-auth-service-provider 提供的 URL 进行查询,而不要使用硬编码的值。以 Apple iOS 为例,它会为所有 OAuth 请求添加一个额外的 application_id 参数,并且应在 OAuth Echo 的各个阶段保持该参数不变。 对于 OAuth 授权部分,取出 x-verify-credentials-authorization 的头部值,并在调用服务提供方时将其放入独立的 Authorization 头部。为稳妥起见,确认 x-auth-service-provider 中的值是否正确。
  • 如果服务提供方返回 HTTP 200,则表示正常。委托方应永久存储该图像,生成一个 URL,并将其返回。
  • 如果服务提供方未返回 HTTP 200,则丢弃该图像,并向使用方返回一个错误。