OAuth Echo

OAuth Echo 是一种在与 API 交互时向第三方安全地委托 OAuth 授权的方式。

这种交互涉及 4 种对象:

  • 用户,通过已获授权的特定 Twitter 应用程序使用 Twitter
  • 使用者,或者尝试与第三方媒体提供商(如照片分享网站)进行交互的 Twitter 应用程序
  • 代理商或第三方媒体提供商
  • 服务提供商,也就是Twitter 自身
     

基本操作是,为代理商准备一个要代表应用程序和用户发送到 Twitter API 的请求。在 HTTP 标头中添加本来是已签名的 OAuth 请求的内容,并要求代理商在完成中间操作后将该请求发送给 Twitter。

查看以下示例:用户想上传一张照片。使用者打算通过 POST 对代理商调用上传操作。POST 应包含图像,还应包含下面两个附加项作为 HTTP 标头:

  • x-auth-service-provider — 实际上,应将身份委托发送到此领域;在 Twitter 中将其设置为 https://api.twitter.com/1.1/account/verify_credentials.json。基于 iOS5 的 Twitter 集成将为该 URL 添加一个额外的 application_id 参数,该参数也将用于计算 x-verify-credentials-authorization 中使用的 oauth_signature。
  • x-verify-credentials-authorization — 使用者应创建所有必要的 OAuth 参数,这样才能在 HTTP 标头中使用 OAuth 调用 https://api.twitter.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_providerx_verify_credentials_authorization 的形式发送 — 在本例中,请记得进行转义并将参数包含在 OAuth 签名基本字符串中,这类似于在任何请求中对参数进行编码。最好使用 HTTP 尽可能地保持操作单独执行。

目前,代理商的目标是在保存媒体之前,验证用户是否是其所表明的本人。代理商通过其上传方法收到上述所有数据后,应该暂时存储图像,然后构造一个对 x-auth-service-provider 标头中指定的端点的调用 — 在本例中为 https://api.twitter.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,那么请转储图像,然后将错误返回给使用者。