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

OAuth Echo

OAuth Echo は、API とやり取りしながら、サードパーティに対して安全に OAuth 認可を委譲するための手段です。 このやり取りには 4 つの当事者が関与します。
  • ユーザー — 特定の認可済み X アプリケーションを通じて X を利用しているユーザー
  • コンシューマー — サードパーティのメディアプロバイダ(例: 写真共有サイト)とやり取りしようとしている X アプリケーション
  • デリゲーター — サードパーティのメディアプロバイダ
  • サービスプロバイダ — いわゆる X 本体  
本質的には、アプリケーションとユーザーに代わってデリゲーターが X API に送信するリクエストを用意することになります。通常であれば署名付き OAuth リクエストとなるものを HTTP ヘッダーに追加し、デリゲーターが中間処理を完了した後にそのリクエストを X に送信するよう依頼します。 例として、ユーザーが写真をアップロードしたいとします。コンシューマーは、POST でデリゲーターの upload メソッドを呼び出します。POST には画像を含める必要がありますが、さらに HTTP ヘッダーとして 2 つの追加項目も含める必要があります。
  • x-auth-service-provider — 実質的には、アイデンティティ委譲を送信すべきレルムです。X の場合はこれを https://api.x.com/1.1/account/verify_credentials.json に設定します。iOS 5 ベースの X 連携では、この URL に追加の application_id パラメータを付与します。このパラメータも、x-verify-credentials-authorization で使用される oauth_signature の計算に利用されます。
  • x-verify-credentials-authorization — コンシューマーは、OAuth を使用して HTTP ヘッダーで 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_providerx_verify_credentials_authorization として送信することもできます。この場合、OAuth シグネチャのベース文字列に、パラメータをエスケープしたうえで含めることを忘れないでください。これは、任意のリクエストでパラメータをエンコードする場合と同様です。可能な限り処理を分離しておくために、HTTP ヘッダーを使用するのが最善です。 この時点でのデリゲーターの目的は、メディアを保存する前に、ユーザーが自称どおりの人物であることを検証することです。デリゲーターは、upload メソッド経由で上記のすべてのデータを受け取ったら、画像を一時的に保存し、x-auth-service-provider ヘッダーで指定されたエンドポイント(この場合は https://api.x.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 内の値が期待どおりであることを確認してください。
  • Service Provider が HTTP 200 を返した場合は問題ありません。Delegator は画像を永続的に保存し、URL を生成して返す必要があります。
  • Service Provider が HTTP 200 を返さなかった場合は、画像を破棄し、Consumer にエラーを返してください。