跳转到主要内容

OAuth Echo

OAuth Echo 是一种在与 API 交互时,将 OAuth 授权安全委托给第三方的方式。 此交互涉及四方:
  • the User,即通过特定且已授权的 X 应用使用 X 的用户
  • the Consumer,即尝试与第三方媒体提供方(例如照片分享网站)进行交互的 X 应用
  • the Delegator,即第三方媒体提供方
  • the Service Provider,也就是 X 本身  
本质上,是为委托方准备一个代表某个应用和用户发送到 X API 的请求。将原本需要签名的 OAuth 请求添加到一个 HTTP 头中,并在完成中间操作后,请求委托方向 X 发送该请求。 举例来说:User 想上传一张照片。Consumer 将通过 POST 调用 Delegator 的上传接口。该 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 — Consumer 应创建调用 https://api.x.com/1.1/account/verify_credentials.json 所需的全部 OAuth 参数,并将其放入 HTTP 头中(例如,其格式应类似于 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 的目标是在保存媒体之前验证 User 的身份是否属实。一旦 Delegator 通过其上传方法接收到上述所有 data,应临时存储该图像,然后根据 x-auth-service-provider 头中指定的 endpoint 构造调用——在本例中为 https://api.x.com/1.1/account/verify_credentials.json,并使用 Consumer 在 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,则一切正常。Delegator 应永久存储该图像,生成一个 URL,并返回该 URL。
  • 如果服务提供方未返回 HTTP 200,则丢弃该图像,并向 Consumer 返回一个错误。
I