node.jsを使って簡単にwebサイトにインスタントメッセンジャーを組み込む方法(その2 Facebook連携編)

今回は、前回作成したIMをFacebook対応してみます。


Facebook Chatに関しては一応公式ドキュメントがありますが、
http://developers.facebook.com/docs/chat/
もう、わざとなの?ってぐらい必要な事書いてなくて、間違いがあったりして、結構大変でした。


developer forumや、stackoverflowで情報集めながら、とりあえず出来たので紹介というかメモ。


デモ

認証方法

FacebookはX-FACEBOOK-PLATFORMというSASL認証を提供していて、それを使う事で、アプリからFacebookチャットに接続できるようになります。


X-FACEBOOK-PLATFORMについては公式ドキュメントには超テキトーな事と、まともに動かないサンプルコードしか載ってないので、
詳しく知りたい人は、公開されているライブラリの認証処理を読むのが一番手っ取り早いんじゃないでしょうか。
(つか、これ作った人達はいったいどうやって仕様を調べたんだろうか。)


今回はgithubで公開されていた、turedsocialを使う事にしました。
strophe.jsプラグインで、Facebook接続メソッドが追加されます。
https://github.com/rubenjgarciab/turedsocial

turedsocialを試してみたけど、

エラーorz...


調べたところ、strophe.jsのバージョンが原因で動かなくなってたっぽいので、最新版に合わせて修正しました。
必要であればここから勝手にゲットしてください。
https://github.com/kissrobber/turedsocial

で、無事Facebookに接続できたけど、

このライブラリには問題があって、app secretをjavascriptに記述するような作りになっています…


これだと一般公開するアプリには使えないです。
通常、こういう(JavaScriptからapp secretを使いたい)場合はどうするのか調べてみたところ、
app secretの代わりに、ログイン時に一時的に発行されるsession secretというのを使うみたいです(たぶん)。
http://developers.facebook.com/docs/reference/rest/auth.promoteSession/


FBのjavascriptSDKを使っている場合は、

FB.getSession().secret

こんな感じでゲットできます。

これでOKかと思ったら、

だめでした…


app secretの代わりにsession secretを使うように変更してみたけど、
何か間違えているのか?
xmpp loginはsession secretサポートしないのか?
(誰か分かる人いたら教えてください)

app secret を使う処理はサーバ側で実装する様に変更

app secretを使用している処理は、SASL challengeのMD作成処理のみのようなので、
とりあえず、今回は、この処理だけサーバに投げる事にしました。
暇があったら公式SDKとかもちゃんと読んで調べた方がよいかとおもいますが。


該当する修正はこの辺り、
https://github.com/kissrobber/facebook_chat_with_javascript_on_node.js/commit/7822f541d31f54bd705b53093a6ec5513a98f532#diff-3

んで、無事完成

なんか疲れて書くの面倒くさくなってきたので、必要な人は勝手にみてください。
https://github.com/kissrobber/facebook_chat_with_javascript_on_node.js
Herokuに載せればそのまま動くようになっています。