ブラウザからTwitter APIを呼ぶためのCORSプロキシサーバを書いた

GitHub - slaypni/Corset: Twitter CORS proxy server

Twitter APICORSに対応しておらず、Access-Control-Allow-OriginなどのヘッダがHTTPレスポンスに付与されない。そのため、ブラウザはXHRを使って直接Twitter APIを叩くことができない。この問題を解決するひとつの方法が、Twitter APIを中継してクロスドメインを許可するレスポンスを返すサーバを用意することである。この記事で紹介するCorsètは、この中継を行うサーバ側プログラムである。

このコードはGithubからcloneして、すぐに利用できる。以下ではCorsètの特徴と使いかたを紹介する。

Heroku対応

CorsètはHerokuにデプロイして使うことができる。Herokuに関する設定は次のようになる。

heroku create
heroku addons:add redistogo:nano
heroku config:set URL=http://your-server-name.herokuapp.com

セッション管理で用いるRedisを有効にするのと、認証のコールバックで必要となる、自身のURLを環境変数に設定する。

OAuth認証

CorsètからAPIを呼ぶためには、まずCorsètを通じてTwitterの認証を行う。そのために必要な情報はsrc/config.coffeeに記述する。

module.exports =
    sessionSecret: 'Random string'
    oauthConsumerKey: 'Twitter OAuth Consumer key'
    oauthConsumerSecret: 'Twitter OAuth Consumer secret'
    firebaseSecret: 'Firebase Secret'
    originUrl: 'http://example.com'
    callbackUrl: 'http://example.com'

oauthConsumerKeyとoauthConsumerSecretにTwitterのConsumer keyとConsumer Secretを入力する。
callbackUrlには、認証の成功時のリダイレクト先を入力する。
またoriginUrlにAccess-Control-Allow-Originヘッダの値も設定しておく。この値は'*'ではだめで、呼び出し元のURLを入力する。そうしなければクレデンシャルの送信ができない(セッションを持てない)ためである。

src/config.coffeeを書き換えたらcake buildとしてコンパイルしてから、Herokuにpushする。これで認証を行うことができる。URLは"/auth"。

API Call

Corsètは、Consumer KeyやAccess Tokenなどをすべてサーバ側で持ち、ブラウザとはセッションを張ることでAPIの呼び出しを代行する。そのためブラウザはAPIを呼ぶとき、XHRでwithCredentials=trueとしてリクエストを送る必要がある。呼び出しURLは"https://api.twitter.com"を"http://your-server-name.herokuapp.com/api"と置き換えるだけでよい。

Firebase Auth Token

オプション機能。src/config.coffeeのfirebaseSecretを設定することで、FirebaseのCustom Loginで利用するTokenを取得できるようになる。URLは"/auth/firebase"。