OAuth gate のご紹介

2014年1月15日、Twitter API へのアクセスが、SSL必須となりました。
このため、この記事は、全く時代遅れのものとなりました。
記録としの意味で、残していますが、実用的な意味はなくなりましたので、その点はご注意ください。

さて、Twitter の Basic 認証廃止に伴って、OAuth gate というのを作ってみました。
これは、既に、Basic 認証で動いているアプリケーション(実際には、単純なBotのみ)のヘッダを、OAuth 認証のものに差し替えて、ほぼ、Botの修正なしで OAuth 認証に対応しようというものです。

同様のサービスもいくつかあるようですが、その中で、機能的にはおそらくもっとも低レベルなものです。
そして制約も多いです。
それでも、以下に紹介させていただきます。
動作的には、「無保証」ですが、ソースも公開しますので、必要があれば何とか対応してください。

特徴

対象

手順

アプリケーションの登録と、各種のキー入手

まだ登録ができていない場合は、
TwitterにOAuthクライアントアプリを登録する方法などを参考に、登録してください。

なお、補足すれば

さらに、各種のキー入手は、
これでデベロッパーの手間激減!自分のoAauth用アクセストークンの取得が簡単に!などを参考にしてください。
実際、Botであれば(=Bot 自身のアカウントで投稿するのであれば)キーの入手が非常に楽になったのが助かります。

これで、OAuth に必要な4つのキー(Consumer key, Consumer secret , Access Token, Access Token Secret)が入手できます。

設定ファイルを置くフォルダの準備

え、作者が非常にずぼらなもので、設定ファイルを置くフォルダは(名前も)固定です。
しかも、フォルダがなければないで、何もしません。
そういうことで、まず、設定ファイルを置くフォルダを準備してください。

具体的には、 c:\user というフォルダを準備してください。
Windows Vista 以降では、c:\users というファイル(見かけは「ユーザー」)がありますが、最後の s の有無が違います。

設定ファイルの作成

最初に、設定ファイルを作成します。
oauth_gate_exe.zip をダウンロードして、解凍してください。
その中にある、gatesetting.exe が設定ファイル作成プログラムになります。

プログラムを実行して、上記の4つのキーおよび、Botが使用している、Twitter のアカウントとパスワードを入力後、「パラメータ生成」をクリックしてください。
なお、Twitter のアカウントとパスワードは、OAuth gate では保存しません。
正規の Bot からの投稿であることを確認するために、アカウントとパスワードから計算したデータを保存しています。

Bot 側の設定

次に、Bot 側の設定を変更します。
OAuth gate は、Basic 認証で動作している Bot があるという前提で作成しています。
この Bot の出力を受け取って、OAuth ヘッダに変換した後、Twitter に投げます。
一方で、Bot自体は、直接 Twitter に投稿する設定になっているはずです。

この部分を変更して、Botの出力を、OAuth gate で受け取れるようにします。
具体的には、Botが、twitter.com とか、api.twitter.com に接続をするようになっているはずの部分を、127.0.0.1 (これは、Bot が動作しているパソコンを指すアドレスになります)に変更します。

OAuth gate のポート設定

OAuth gate は、80番ポートで接続を待ちます。(これは、通常の Web サービスと同じポートです)
もしも、80番ポートが使えない場合、先ほど生成した、c:\user\sekki_gate.ini の、[SYSTEM] というセクションを作成し、PORT=8080 など、ポート番号を設定してください。

動作

以上で設定は終わりです。
先ほどダウンロードしたファイルにある、oauth_gate.exe が実際の、OAuth gate プログラムになります。
これを実行させた状態で、(設定の終わった)Bot が動作すると、Twitter に対して、OAuth で投稿を行います。

セキュリティ上の話題

OAuth が使用するポートについて

OAuth gate は、動作するパソコン内部で、サーバーとして動作します。
外部からの不正接続があった場合、それに対し接続をしてしまいます。
動作の上では、Bot からの正しいアカウント・パスワードがないと、動作しないようにはなっていますが、注意が必要です。
ルータのポート選択機能などで、外部からの不正接続を回避してください。

一方で、動作パソコン内部で動作しているファイヤウォールが、警告を発することがあります。
OAuth gate を動作させるためには、ファイヤウォールのブロックを(OAuth gate で使うポート・通常は 80番)選択的に解除してください。

OAuth 関連キーの保存について

OAuth gate では、OAuth キーを暗号化せずにファイルに保存しています。
このプログラム自体が、ローカルで動作し、外部には、シークレットキーを送出しないため、ある程度のセキュリティは保たれておりますが、シークレットキーを含めて、平文で保存しているため、ウイルスの感染などで、これが流出する可能性はあります。
この点には、注意をお願いいたします。

なお、Bot が使用している Twitter のアカウントおよび、パスワードは保存せず、「ダイジェスト」と呼ばれるデータで正当性の判断を行っております。
そのため、こちらは、(OAuth gate としては)安全性が確保できていると考えます。

免責

OAuth gate の提供に際して、明示的にも黙示にも、無欠陥であることの保証はなされません。
また、その他の一切の保証なしに、現状のまま提供されるものです。
また、OAuth gate の動作に関し、作者はは責任を負うものではありません。

基本的な動作

以下のような動きをします。
いくつか、「無条件に差し替え」とか、「body は1行だけ」とか、勝手な仮定で動いているところもあります。

○  1)[SYSTEM] port の値(デフォルトは 80)で、サーバーとして待機する
○  2)クライアントからの接続要求を受け入れる
○  3)クライアントから切断が要求されたら、接続を切断する(自動)
○   ・その際、Twitter 側に接続中であれば、その接続を切断する

○  4)接続完了後、クライアントからのデータを受信する
○  5)クライアントからのデータは CRLF で1行ごとに区切る
○  6)2個の空行(CRLF のみの行)を受信したら、次の処理に移行する

○  7)最初の空行の直前までをヘッダとする。
○  6)最初の空行の次の行をボディとする(ボディは1行のみ)
○    ・以上の結果を、Memo_server_recv に順次書き込む

    8)ヘッダの処理
○    ・POST で始まり、.json を含む行 → POST http://api.twitter.com/1/statuses/update.json HTTP/1.1 に差し替える
○    ・POST で始まり、.json を「含まない」行 → POST http://api.twitter.com/1/statuses/update.xml HTTP/1.1 に差し替える
○    ・Authorization: で始まる行
○      Basic 以降、行末までの文字列を取得する
○      文頭・文末のスペースをトリミングする
○      得られた文字列のハッシュを算出する(MD5)
○      算出されたハッシュが、[USER] ID_Pass と一致することを確認する
○        ・一致しない場合、Twitter 側への送信は行わない
○       クライアントへは、とりあえず、エラーの旨を返す。
○      OAuth ヘッダを算出し、これに差し替える
○    ・Host: で始まる行 → Host: api.twitter.com に差し替える
○      ・その他の行 → そのまま
○    ・POST で始まる行、Authorization: で始まる行のいずれかが存在しない場合、Twitter 側への送信は行わない
      クライアントへは、とりあえず、エラーの旨を返す。

○    ・以上の変換処理(そのままの行を含む)結果を、Memo_twitter_send に順次書き込む

    9)ボディの処理
○    ・ボディの内容を、そのまま、Memo_twitter_send に書き込む

○  10)api.twitter.com に接続要求を行う
○  11)接続を待つ → 接続できないとき、Memo_twitter_recv に、「接続エラー」を書き込み、サーバーとしての接続を遮断する
○  12)api.twitter.com に対して、Memo_twitter_send の内容を順次送信する
○  13)api.twitter.com に対して、読み込みを行い、読み込み内容を、Memo_twitter_recv に順次書き込むとともに、クライアントに送信する

○  14)クライアントからの切断要求を受けて、接続を切断する。(3)と同じ

ソースファイルについて

いかにソースファイル(プロジェクトファイル)をおいておきます。
開発環境は、Turbo C++ になります。

ソース(プロジェクト)ファイル
OAuth 処理周辺のソースファイル

それぞれのファイルの署名(PGP)

公開鍵は http://www.nagi.asano.name/pgp5.htm にあります。

--------------- ouath_gate_exe.zip ---------------------------
-----BEGIN PGP SIGNATURE-----
Version: PGP Personal Privacy 6.5.8

iQA/AwUATBEqEc1lfwjWj2n2EQK6MgCg3SWcmscRf7pIXooRi3eur8WCgLsAnjKk
YSnah/48gUQ/C9ylA7UdCsz0
=1NaU
-----END PGP SIGNATURE-----

--------------- ouath_gate_src.zip ---------------------------
-----BEGIN PGP SIGNATURE-----
Version: PGP Personal Privacy 6.5.8

iQA/AwUATBEqgM1lfwjWj2n2EQKGcQCdEON2Z4vd0Y2wb/kbXOCUo0xgjLcAn224
7dWYsHnWbqdZch6twzCmHN8D
=IcYS
-----END PGP SIGNATURE-----

--------------- ouath_src.zip --------------------------------
-----BEGIN PGP SIGNATURE-----
Version: PGP Personal Privacy 6.5.8

iQA/AwUATBEq1s1lfwjWj2n2EQJkjACg6fcx8zk2oW3HHeUzQJZ3nI6B/JAAn3cU
vzSExLEMtne32aRzAufhdnXz
=rk0p
-----END PGP SIGNATURE-----


Nagi -- from Yurihama, Tottori, Japan.
E-mail:k1@axis.blue