sailsで簡単にTwitterログインする

expressの情報はいくらでも出てきますがsailsはあんまりだったので書いとく.

  • 使用するライブラリ
    • everyauth(最新版で.この時点では0.4.5)

先にTwitterDeveloperでAPI key取っておいてくださいね.

1.everyauth入れる

  • npm install everyauth --save とかでeveryauthインストールする

2.config/以下にexpress.jsとかなんでもいいからファイル用意する

  • 名前何でもいいです(*.jsという形式であれば).

3. 2で作ったファイルの中でeveryauthをミドルウェアとして設定する

  • よくサンプルではexpressの`app.use(middleware)`という感じでミドルウェア設定しているけど,sailsの場合も同じ.ただしappを受け取る場所がexpressと違う(expressの場合はapp.js).sailsの場合,configディレクトリ以下にjsファイル作って,その中で
module.exports.express = {
    customMiddleware: function(app){
        app.use(everyauth.middleware());
    }
}

ってやることでappにアクセスし,app.useすることができる.config以下のファイルはapp.js実行時に自動的に読み込まれ走る.

  • これを踏まえてeveryauth使おうとするとこんなかんじ(実際はいい感じに分けたりするのでしょうがとりあえずわかりやすいので).
var everyauth = require('everyauth')
everyauth.twitter
    .consumerKey('-------twitterで取得したの入れてください-------')
    .consumerSecret('-----------twitterで取得したの入れてください-------')
    .moduleTimeout( 10000 )
    .findOrCreateUser(
        function(session, accessToken, accessTokenSecret, twitterUserData){
            var promise = this.Promise()

            // ここでログインの処理をする.
            // 例えばDBからユーザ情報ないか探して引いてくるなどが考えられる.
            // ユーザ情報あったらセッションに「ログインしました」情報を設定しておくなど.
            // session.loggedIn = true;

            promise.fulfill()
            return promise
    })
    .redirectPath('/myPage'); // ログイン完了したらここに飛ぶ

everyauth.everymodule
    .handleLogout( function(req, res){
        res.rewriteHead(303, {'Location': '/logout'}) // ログアウトしたらここに飛ぶ
        res.end()
    })
    .moduleErrback(function(err){
    console.log(err)
});

module.exports.express = {
    customMiddleware: function(app){
        app.use(everyauth.middleware());
    }
}

4.Twitterログインしてみる

f:id:funnelbit:20140422093709p:plain
これで行けるはず.everyauthが多分いちばん安定では無いかなと思います(passport-twitterとかサンプルが動かなかった.多分nodeのバージョンが新しいからか.最終更新も2年前とかなってるからどうなってるのかよくわからない).