Express.js + everyauthで認証する方法のメモ

読了まで:約4分


概要: Express.js で​ユーザー認証したい​時は​ everyauth が​便利だよ!


こんに​ちま!

なんか​ものっそ久しぶりな​気が​しますが、​皆さん​こんに​ちま!​ いつも​心に​ make money、​悪い​意味で​年金が​恋人、​ に​ゃるらコト岡村 直樹(24)です。​皆様お久しぶりです。

六月のは​じめ、

  • [[いろいろ​あって​うつ病に​なったりしたけど​ようやく​復活してきました​ /post/50791597902]]

とか​ほざいて​たんですが、​あの​後、​特に​梅雨が​明けた​ぐらいから、​ 色々と​有って​うつ病を​ぶり返してしまい、​ いままで​ダウナーモードで​ネットするのも​だる​いわー、​ iPad で​ Feed 消化とか​ Tumblr 閲覧とか​ 2ch watch とかもなに​これしんどい、​ 家事とか​もう​つらいんですけど​状態!​ と​いう​状況を​さまよっておりました。

ただ、​最近は​ちょっと​持ち直してきて、​ 薬飲み忘れて​躁状態で​プログラミングやってたり、​ あるいは​その次の​日、​超しんどい、​何コレ……、とか​ そういう​風な​感じでしたが、​一応​日々なんとか​やっております。

んで、​最近は​そんな​感じだったんですが、​本日の​ネタは​この間、​ 躁状態プログラミングやってた​時に、

  • CoffeeScript + Express.js + everyauth

を​使う際に​モロハマりした​ものの、​無事解決出来て​ヤターと​なった​あたりの​コトを、​ つらつらっと​書きたいと​思います。

今回​使用した​ライブラリの​説明

  • Express.js node.js での​ Web Application framework

  • 最近​ 3.x 系が​出た

  • 今回は​ 3.x 系を​使用

  • everyauth node.js の​ connect.js 向け認証モジュール

  • 対応サイトが​多い。​代表格は​ Twitter、​Facebook、​Instagram、​mixi とかも​対応

  • express.js 3.x 系で​使うには​ git branch から​ everyauth を​インスコする​必要​あり

  • CoffeeScript JavaScript 書くの​めんど​いから​使用

  • ちょさんにはで​ぃすられる

  • 個人的には​なれると​結構らく​ちんです

Express.js + everyauthの​ハマりどころ

1. コードを​書く​順番

Express.jseverauthを​一緒に​使う​場合、​ everyauthの​各種 API key 等の​設定を​書く​順番が​超重要に​なります。

どういう​コトか、と​いうと、everyauthでは​認証モジュールの​設定に​関して、​ coffeescript を​使う​場合では、

everyauth = require 'everyauth'
config    = require 'config'
everyauth.twitter.configure
consumerKey:    config.auth.twitter.consumer
consumerSecret: config.auth.twitter.secret
entryPath:      '/login/twitter'
redirectPath:   '/login/twitter/callback'
findOrCreateUser: ( session, token, secret, data ) ->
promise = @Promise()
promise.fulfill( id: "twitter:#{data.id}" )
return promise

と​いう​感じの​コードを​書く​必要が​ありますが、​ この​コードが、

app.configure ->
# (略)
app.use express.cookieParser( config.cookie.secret )
app.use everyauth.middleware(app) # <- コレ
# (略)

を​書くよりも​ だと、entryPath​で​指定した​ URL、​ 例えばlocalhost:3000/login/twitterに​アクセスしても、​ Cannot get /login/twitterな​感じの​ 404 を​拝み続けるは​めに​なります。

なんで、everyauth​で​認証設定を​書く​時は、​ express.jseveryauthの​認証ミドルウェアを​食わせる​前に​書きましょう。

2. everyauth.everymodule.findUserByIdfindOrCreateUserの​組み合わせ方

この​二つなんですが、​似てるようで​機能が​ちょっと​違うので、​ 最初わけが​わからないよ!​ な​ QB 状態でした。

で、​今は​わかったんで​一応​書くと、

  • everyauth.everymodule.findUserById データベースから​ユーザー情報を​引っ張ってくる

  • ここで​渡した​ Object が​ view helper の​ user オブジェクトに​入る

  • findOrCreateUser ユーザー ID を​見つけるか​作る

  • ここで​ UserID を​データストアに​保存しても​良いけど、​しなくても​ OK

重要なのは、​User ID を​所定の​方法で​返す事

と​いう​感じです。

具体的には、

everyauth.twitter.configure
(略)
findOrCreateUser: ( session, token, secret, data ) ->
promise = @Promise()
promise.fulfill({ id: "twitter:#{data.id}" }) # <- ココでUserIDを渡す
return promise

と​いう​感じの​コードを​書くんですが、​ この​時promise.fulfillに​渡した​オブジェクトの​ idプロパティの​値が、everyauth.everymodule.findByIDの、

everyauth.everymodule.findUserById ( userId, callback ) ->
console.log(userId) # <- ココがさっきの`twitter:#{data.id}`になる
(略)

userIdの​値に​なります。

この​辺りの​ポイントと​いうか​ハマりどころと​しては、​ こういう​感じに​なるかと​思います。

と​いうわけで以上​ハマりどころでした。

Express.jseverauthの​ハマり所と​しては、​この​二点ぐらいだと​思うので、​ この​二点さえ押さえておけば、​ 後は​オリジナルの​ドキュメント読めばなんとか​なると​思います。

ちなみに​僕は​これを​理解して、​実際に​動く​コードを​書き上げるまでに、​ まるっと​一日​使ってしまいました。​薬飲み忘れの​躁状態って​怖い。

まあ以上が、​サンプルコードでは​わからなかった​ポイントかな、​ と​思います。


ちなみに​本件とは​あんまり​関係ないですが、​ 6 月だったか​ 7 月だったかに、​この​ブログ、​ 空繰再繰(カラクリサイクル)の​ルックスを​変更していたりしました。

多分​この​ブログを​前にも​見ていて、​今回も​見た​人は​気づいてるかなーとは​思いますが、​ 一応​告知まで。​遅くなって​すんまそん。

と​いうわけで​以上、​久々の​更新でした。​まる。

#FIXME

にゃるら(カラクリスタ)

『輝かしい青春』なんて失かった人。
次に備えて待機中。

今は趣味でプログラミングをして
生活しています。