跳转到主要内容
OAuth Echo 是一种在与 API 交互时,将 OAuth 授权安全地委托给第三方的方式。
此交互涉及四方:
- 用户(User):通过某个已授权的 X 应用使用 X
- 消费者(Consumer):尝试与第三方媒体提供方(例如照片分享网站)交互的 X 应用
- 委托方(Delegator):第三方媒体提供方
- 服务提供方(Service Provider):即 X 本身
本质上,需要准备一个请求,供委托方代表某个应用和用户发送至 X API。将原本应签名的 OAuth 请求放入 HTTP 头中,在完成中间操作后请委托方将该请求发送给 X。
举例:用户想上传一张照片。消费者将通过 POST 调用委托方的上传接口。该 POST 应包含图像,还需要在 HTTP 头中包含两个额外字段:
请注意,整个交易需要在 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 认证头。
使用 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,则丢弃该图像,并向使用方返回一个错误。