メインコンテンツへスキップ
OAuth Echo は、API とやり取りする際に、第三者に対して OAuth 認可を安全に委任する手段です。
このやり取りには 4 つの当事者が関与します:
- ユーザー — 特定の認可済み X アプリを通じて X を利用している人
- コンシューマー — サードパーティのメディアプロバイダー(例: 写真共有サイト)とやり取りしようとしている X アプリ
- デリゲーター — サードパーティのメディアプロバイダー
- サービスプロバイダー — すなわち X 本体
要するに、アプリケーションとユーザーに代わって X API に送信するリクエストをデリゲーター向けに用意します。通常なら署名付きの OAuth リクエストとなる内容を HTTP ヘッダーに追加し、中間処理が完了した後にそのリクエストを X へ送るようデリゲーターに依頼します。
例: ユーザーが写真をアップロードしたいとします。コンシューマーは POST でデリゲーターのアップロードを呼び出します。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 — コンシューマーは、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_provider と x_verify_credentials_authorization として送信することも可能です。この場合、OAuth 署名のベース文字列にパラメータをエスケープして含めることを忘れないでください。これは任意のリクエストでパラメータをエンコードするのと同様です。処理をできるだけ分離するためには、HTTP ヘッダーを使用するのが最善です。
この時点でのデリゲーターの目的は、メディアを保存する前に、ユーザーが本人であることを検証することです。デリゲーターがアップロードメソッド経由で上記のすべてのデータを受け取ったら、画像を一時的に保存し、続いて x-auth-service-provider ヘッダーで指定されたエンドポイント(この場合は https://api.x.com/1.1/account/verify_credentials.json)への呼び出しを、コンシューマーが x-verify-credentials-authorization ヘッダーで提供したものと同じ OAuth 認証ヘッダーを用いて構築します。
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 にエラーを返します。