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

リクエストの認可

このドキュメントの目的は、X API へ認可されたリクエストを送信できるように、HTTP リクエストをどのように変更するかを説明することです。 X のすべての API は HTTP プロトコルに基づいて実装されています。つまり、あなたが作成する X の API を利用するソフトウェアは、X のサーバーに対して一連の構造化されたメッセージを送信するということです。たとえば、「Hello Ladies + Gentlemen, a signed OAuth request!」というテキストをツイート (ポスト) として投稿するリクエストは、次のようになります。
POST /1.1/statuses/update.json?include_entities=true HTTP/1.1
Accept: */*
Connection: close
User-Agent: OAuth gem v0.4.4
Content-Type: application/x-www-form-urlencoded
Content-Length: 76
Host: api.x.com

status=Hello%20Ladies%20%2b%20Gentlemen%2c%20a%20signed%20OAuth%20request%21
上記のリクエストは、ほとんどの HTTP ライブラリであれば、さほど難なく生成して送信できます。しかし、次の点が不明であるため、上記のリクエストは無効と見なされます。
  1. どのアプリケーションがリクエストを送信しているのか
  2. リクエストがどのユーザーの代理でポストしているのか
  3. ユーザーが、そのユーザーの代理でポストする権限をそのアプリケーションに付与しているかどうか
  4. 送信中に第三者によってリクエストが改ざんされていないかどうか
アプリケーションがこの情報を提供できるようにするために、X の API は OAuth 1.0a プロトコル を利用しています。ごく単純化して言うと、X の実装では、認可を必要とするリクエストに、上記の問いに答えるのに十分な情報を含んだ追加の HTTP Authorization ヘッダーを含めることを要求します。前述の HTTP リクエストにこのヘッダーを追加したバージョンは、次のようになります (通常、Authorization ヘッダーは 1 行である必要がありますが、ここでは可読性のために折り返しています) 。
POST /1.1/statuses/update.json?include_entities=true HTTP/1.1
Accept: */*
Connection: close
User-Agent: OAuth gem v0.4.4
Content-Type: application/x-www-form-urlencoded
Authorization:
OAuth oauth\_consumer\_key="xvz1evFS4wEEPTGEFPHBog",
oauth_nonce="kYjzVBB8Y0ZFabxSWbWovY3uYSQ2pTgmZeNu2VS4cg",
oauth_signature="tnnArxj06cWHq44gCs1OSKk%2FjLY%3D",
oauth\_signature\_method="HMAC-SHA1",
oauth_timestamp="1318622958",
oauth_token="370773112-GmHxMAgYyLbNEtIKZeRNFsMKPR9EyMZeS9weJAEb",
oauth_version="1.0"
Content-Length: 76
Host: api.x.com

status=Hello%20Ladies%20%2b%20Gentlemen%2c%20a%20signed%20OAuth%20request%21
このリクエストが作成された当時は、X API によって有効なものとして受け付けられていたはずです。 この署名プロセスがご自身のインテグレーションの範囲を超えていると感じる場合は、OAuth を使用せずに X API とやり取りできる Web Intents の利用を検討してください。   パラメーターの収集 ヘッダーには 7 つのキーと値のペアが含まれており、キーはすべて文字列 “oauth_” で始まっていることが確認できるはずです。任意の X API リクエストにおいて、これら 7 つの値を収集して同様のヘッダーを作成することで、そのリクエストの認可情報を指定できます。各値がどのように生成されるかは、以下で説明します。 Consumer key oauth_consumer_key は、どのアプリケーションがリクエストを送信しているかを識別します。この値は、開発者コンソール 内のご自身の X app の設定ページから取得してください。
oauth_consumer_keyxvz1evFS4wEEPTGEFPHBog
Nonce oauth_nonce パラメーターは、アプリケーションが各リクエストごとに生成する必要がある一意のトークンです。X はこの値を使用して、同じリクエストが複数回送信されていないかどうかを判定します。このリクエスト用の値は、32 バイトのランダムデータを base64 エンコードし、その後に英数字およびアンダースコア以外の文字をすべて取り除くことで生成されていますが、比較的ランダムな英数字文字列を生成できる方法であれば、どのような手法でも問題ありません。
oauth_noncekYjzVBB8Y0ZFabxSWbWovY3uYSQ2pTgmZeNu2VS4cg
Signature oauth_signature パラメーターには、他のすべてのリクエストパラメーターと 2 つの秘密の値を署名アルゴリズムに通して生成される値が含まれます。署名は、X がリクエストが送信中に改ざんされていないこと、リクエストを送信しているアプリケーションが正当であること、そしてそのアプリケーションがユーザーのアカウントとやり取りする権限を持っていることを検証できるようにするためのものです。 このリクエストの oauth_signature を計算するプロセスは、署名の作成で説明しています。
oauth_signaturetnnArxj06cWHq44gCs1OSKk/jLY=
Signature method X が使用する oauth_signature_method は HMAC-SHA1 です。この値は、X API に送信されるすべての認可済みリクエストで使用する必要があります。
oauth_signature_methodHMAC-SHA1
Timestamp oauth_timestamp パラメーターは、リクエストが作成された時刻を示します。この値は、リクエストが生成される時点における Unix エポックからの経過秒数である必要があり、ほとんどのプログラミング言語で容易に生成できます。X は、あまりにも過去に作成されたリクエストを拒否するため、リクエストを生成するコンピューターの時計を NTP で同期させておくことが重要です。
oauth_timestamp1318622958
Token oauth_token パラメーターは、通常、ユーザーが自分のアカウントへのアクセスをあなたのアプリケーションと共有することを許可していることを表します。この値が渡されない、または別の形式のトークンになる認証リクエストもいくつかありますが、それらについては アクセス トークンの取得 で詳細に説明しています。一般的な用途の多くのリクエストでは、アクセストークン と呼ばれるものを使用します。 自分のアカウント用の有効な アクセストークン は、開発者コンソール 上の X app の設定ページで生成できます。
oauth_token370773112-GmHxMAgYyLbNEtIKZeRNFsMKPR9EyMZeS9weJAEb
Version oauth_version パラメーターは、X API に送信されるすべてのリクエストで常に 1.0 にする必要があります。
oauth_version1.0

ヘッダー文字列の構築

ヘッダー文字列を構築するには、DST という名前の文字列に書き込んでいくことをイメージしてください。
  1. 文字列 “OAuth ” (末尾のスペースを含む) を DST に追加します。
  2. 上で挙げた 7 つのパラメータの各キーと値のペアについて、次を行います:
    1. キーをパーセントエンコードし、その結果を DST に追加します。
    2. 等号文字 ‘=’ を DST に追加します。
    3. 二重引用符 ‘”’ を DST に追加します。
    4. 値をパーセントエンコードし、その結果を DST に追加します。
    5. 二重引用符 ‘”’ を DST に追加します。
    6. まだ残っているキーと値のペアがある場合は、カンマ ‘,’ とスペース ‘ ‘ を DST に追加します。
この文字列を構築する際には、特に値のパーセントエンコードに注意してください。たとえば、oauth_signature の値 tnnArxj06cWHq44gCs1OSKk/jLY= は、tnnArxj06cWHq44gCs1OSKk%2FjLY%3D としてエンコードする必要があります。 上記のパラメータに対してこれらの手順を実行すると、次のような文字列になります。
OAuth oauth\_consumer\_key="xvz1evFS4wEEPTGEFPHBog", oauth\_nonce="kYjzVBB8Y0ZFabxSWbWovY3uYSQ2pTgmZeNu2VS4cg", oauth\_signature="tnnArxj06cWHq44gCs1OSKk%2FjLY%3D", oauth\_signature\_method="HMAC-SHA1", oauth\_timestamp="1318622958", oauth\_token="370773112-GmHxMAgYyLbNEtIKZeRNFsMKPR9EyMZeS9weJAEb", oauth_version="1.0"
この値はリクエストの Authorization ヘッダーに設定する必要があります。