メインコンテンツへスキップ

OAuth Echo

OAuth Echo は、API とやり取りしながら、サードパーティに対して OAuth 認可を安全に委任するための仕組みです。 このやり取りには 4 つの当事者が関与します:
  • User — 特定の認可済み X アプリケーションを通じて X を利用しているユーザー
  • Consumer — サードパーティのメディアプロバイダー(例: 写真共有サイト)とやり取りしようとしている X アプリケーション
  • Delegator — サードパーティのメディアプロバイダー
  • Service Provider — いわゆる X 本体  
要するに、アプリケーションとユーザーに代わって X API に送信するリクエストを Delegator に用意させます。通常であれば署名付き OAuth リクエストとなる内容を HTTP ヘッダーに入れ、Delegator が中間処理を完了した後にそのリクエストを X に送るよう依頼します。 例: User は写真をアップロードしたい。Consumer は Delegator に対して POST で upload を呼び出します。POST には画像を含める必要がありますが、HTTP ヘッダーとして次の 2 つの項目も含める必要があります:
  • x-auth-service-provider — 実質的に、アイデンティティ委任を送る先(レルム)です。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 は、HTTP ヘッダーで OAuth を用いて https://api.x.com/1.1/account/verify_credentials.json を呼び出せるよう、必要なすべての OAuth パラメータを作成する必要があります(例: OAuth oauth_consumer_key=”…”, oauth_token=”…”, oauth_signature_method=”…”, oauth_signature=”…”, oauth_timestamp=”…”, oauth_nonce=”…”, oauth_version=”…” のような形式)。  
トランザクション全体は、oauth_timestamp が有効な時間内に完了する必要があることに注意してください。 また、これら 2 つのパラメータはヘッダーではなく、POST の本文で x_auth_service_provider と x_verify_credentials_authorization として送ることもできます。この場合、OAuth シグネチャベース文字列にパラメータをエスケープして含めることを忘れないでください(任意のリクエストでパラメータをエンコードするのと同様)。可能な限り処理を分離するため、HTTP ヘッダーを使用するのが最善です。 この時点での Delegator の目的は、メディアを保存する前に User が本人であることを検証することです。Delegator が upload メソッド経由で上記の data をすべて受け取ったら、画像を一時的に保存し、Consumer が x-verify-credentials-authorization ヘッダーで提供したのと同じ OAuth 認証ヘッダーを用いて、x-auth-service-provider ヘッダーで指定された endpoint(この場合は https://api.x.com/1.1/account/verify_credentials.json)への呼び出しを組み立てる必要があります。  

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 を生成して返します。
  • サービスプロバイダーが HTTP 200 を返さなかった場合は、画像を破棄し、Consumer にエラーを返します。
I