OAuth Echo
- the User,即通过特定且已授权的 X 应用使用 X 的用户
- the Consumer,即尝试与第三方媒体提供方(例如照片分享网站)进行交互的 X 应用
- the Delegator,即第三方媒体提供方
- the Service Provider,也就是 X 本身
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 返回一个错误。