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

リクエストの認可

このドキュメントの目的は、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 は、どのアプリケーションがリクエストを行っているかを識別します。developer portalX App の設定ページからこの値を取得してください。
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 に記載しています。一般的な用途のリクエストでは、通常「access token」を使用します。 あなたのアカウント用の有効な access token は、developer portal 上の X app の設定ページで生成できます。
oauth_token370773112-GmHxMAgYyLbNEtIKZeRNFsMKPR9EyMZeS9weJAEb
Version X API に送信されるすべてのリクエストにおいて、oauth_version パラメータは常に 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 ヘッダーに設定してください。
I