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

リクエストの認可

このドキュメントの目的は、X API に認可済みリクエストを送信するために、HTTP リクエストをどのように変更するかを説明することです。 X のすべての API は HTTP プロトコルを基盤としています。つまり、X の API を利用するあなたのソフトウェアは、X のサーバーに一連の構造化メッセージを送信します。たとえば、「Hello Ladies + Gentlemen, a signed OAuth request!」というテキストを Tweet として投稿するリクエストは、次のようになります。
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 アプリ の設定ページから、開発者ポータル で取得してください。
oauth_consumer_keyxvz1evFS4wEEPTGEFPHBog
Nonce oauth_nonce パラメータは、各リクエストごとにアプリケーションが生成すべき一意のトークンです。X はこの値を使用して、同じリクエストが複数回送信されていないかを判定します。このリクエストの値は、32 バイトのランダムデータを base64 エンコードし、単語文字以外をすべて除去することで生成されましたが、比較的ランダムな英数字文字列を生成できる方法であれば問題ありません。
oauth_noncekYjzVBB8Y0ZFabxSWbWovY3uYSQ2pTgmZeNu2VS4cg
Signature oauth_signature パラメータには、他のすべてのリクエストパラメータと 2 つのシークレット値を署名アルゴリズムにかけて生成された値が入ります。署名の目的は、X が転送中にリクエストが改ざんされていないことを検証し、リクエスト送信元のアプリケーションを確認し、アプリケーションにユーザーのアカウントとやり取りする権限があることを確認するためです。 このリクエストの oauth_signature の算出手順は、Creating a 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 パラメータは、通常、ユーザーが自分のアカウントへのアクセス共有をあなたのアプリケーションに許可したことを表します。この値が渡されない、または別形式のトークンとなる認証リクエストも一部ありますが、それらについては Obtaining access tokens で詳しく説明しています。一般的な用途のリクエストの多くでは、いわゆる「アクセス トークン」を使用します。 あなたのアカウント用の有効なアクセス トークンは、X アプリ の設定ページで、開発者ポータル 上から生成できます。
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ヘッダーに設定してください。