サイトのトップへ戻る

Twitter 開発者 ドキュメント日本語訳

リクエストを承認する



概要

このドキュメントでは、Twitter APIへ承認済みリクエストを送信するにはどのようにHTTPリクエストを作成するのかを説明します。

Twitter API は全てHTTPプロトコル上で動作します。つまり、Twitter APIを使うソフトウェアはTwitterサーバに対して、決められた構造のメッセージを送信します。 例えば、“Hello Ladies + Gentlemen, a signed OAuth request!”というツイート文の投稿をリクエストするには以下のようになります:

POST /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.twitter.com

status=Hello%20Ladies%20%2b%20Gentlemen%2c%20a%20signed%20OAuth%20request%21

HTTP ライブラリを使えば、簡単に上記リクエストを生成して発行できるでしょう。しかし、以下の情報がないので上記リクエストは無効と見なされます:

  1. リクエストを作成したアプリケーションは何か
  2. リクエストを投稿するユーザーは誰か
  3. このユーザーは、アプリケーションに対して自分の代わりに投稿することを承認したかどうか
  4. このリクエストは転送中に第三者によって改竄されていないかどうか

アプリケーションがこの情報を送信できるようにするため、Twitter APIでは OAuth 1.0a protocolを使用しています。 At a very simplified level, Twitterの実装において、承認が必要なリクエストでは上記4つの質問の答えとなる十分な情報をHTTP Authorizationヘッダに記載する必要があります。 上記の HTTP リクエストにこのヘッダを追加して変更すると、以下のようになります (通常 Authorization ヘッダは一行にする必要がありますが、ここでは読みやすくするために改行しています):

POST /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.twitter.com

status=Hello%20Ladies%20%2b%20Gentlemen%2c%20a%20signed%20OAuth%20request%21

このリクエストを送信することで、Twitter APIはリクエストを有効と認めて受け付け、実際にthis tweetを作成します。

この署名プロセスがあなたの組み込み範疇を超えていると感じた場合は、アクセストークンを使わずにTwitter API とやり取りできるWeb Intentsの使用を検討してください。



承認に必要なパラメータを集める

Authorizationヘッダにはキーと値の組み合わせが7つあるのが分かると思います。キーは全て“oauth_”の文字から始まっています。 Twitter API をリクエストする場合、これら7つの値を集めてヘッダを作成することで、リクエストに使う承認情報を設定することができます。 各値を生成する方法については以下で説明しています:

Consumer key
oauth_consumer_keyではリクエストを作成したアプリケーションが何なのかを識別します。dev.twitter.com/appsのあなたのアプリケーションの設定ページをチェックしてこの値を取得してください。

oauth_consumer_key xvz1evFS4wEEPTGEFPHBog

Nonce
oauth_nonce パラメータは、あなたのアプリケーションがリクエストごとに生成する重複のないトークンです。 Twitter ではこの値を使ってリクエストが複数回送信されているかどうかを判別します。この値はbase64 エンコードした32バイトのランダムデータによって生成し、そこから単語以外の文字を取り除いたものですが、とりあえずランダムな文字列を生成する方法であればここでは問題ありません。

oauth_nonce kYjzVBB8Y0ZFabxSWbWovY3uYSQ2pTgmZeNu2VS4cg

Signature
oauth_signature パラメータには、他の全てのリクエストパラメータと二つの秘密情報を署名アルゴリズムで処理して作成した値を設定します。 署名の目的は、リクエストが転送時に改竄されていないことをTwitterが確認できる、リクエストを送信したアプリケーションをTwitterが確認できる、アプリケーションがユーザーのアカウントにアクセスする承認を受けているかTwitterが確認できる、といったことです。

このリクエストで oauth_signatureが算出されるプロセスについては署名を作成するで説明しています。

oauth_signature tnnArxj06cWHq44gCs1OSKk/jLY=

Signature method
Twitterで使用されるoauth_signature_methodHMAC-SHA1です。この値はTwitter APIへ送信される認証済みリクエストに使用されます。

oauth_signature_method HMAC-SHA1

Timestamp
oauth_timestamp パラメータはリクエストがいつ作成されたかを示します。この値はリクエストが生成されたタイミングのUnixエポック秒にしなければならず、大抵のプログラミング言語で簡単に生成可能です。 Twitterは作成時期が古すぎるリクエストを拒否するため、NTPで時刻同期を行ってコンピュータの時間を正常に保つことが重要です。

oauth_timestamp 1318622958

Token
oauth_token パラメータは通常、アプリケーションに対して付与するユーザーアカウントへのアクセス権を表します。 この値を使わない、または別のトークン形式を使う認証リクエストもいくつかありますが、それらについてはアクセストークンを取得するで説明します。 もっとも一般的なリクエストの場合、アクセストークンと呼ばれるものを使用します。dev.twitter.com/appsのアプリケーションの設定ページで、あなたのアカウントで使う有効なアクセストークンを生成できます。

oauth_token 370773112-GmHxMAgYyLbNEtIKZeRNFsMKPR9EyMZeS9weJAEb

Version
oauth_version パラメータは、Twitter APIへ送信される全てのリクエストにおいて常に1.0となります。

oauth_version 1.0


ヘッダ文字列を作成する

ヘッダ文字列を作成するには、「コピー先文字列」という空の文字列へ必要な文字列を追加していくのをイメージしてください。

  1. 「コピー先文字列」に対して文字列“OAuth ”(最後にスペースを含む)を追加します。
  2. 上記7つの各キー/値の組み合わせに以下の処理を行います。:
    1. キーをパーセントエンコードして「コピー先文字列」へ追加します。
    2. 「コピー先文字列」へ等号文字 ‘=’ を追加します。
    3. 「コピー先文字列」へダブルクォート ‘”’ を追加します。
    4. 値をパーセントエンコードして「コピー先文字列」へ追加します。
    5. 「コピー先文字列」へダブルクォート ‘”’ を追加します。
    6. キー/値の組み合わせが残っている場合は、コンマ ‘,’ とスペース ’ ’ を「コピー先文字列」へ追加します。

この文字列を作成する際には、各値をパーセントエンコードするのには特に注意してください。例えば、 tnnArxj06cWHq44gCs1OSKk/jLY=oauth_signature 値は 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 ヘッダとして設定してください。