node.jsでFacebookアプリ開発(2)

若干の進捗があったので記録。

前回、認証用のパッケージを利用するつもりで準備を進めていました。ふと気づいたのですが、そもそもCanvas Page以外での利用を考えないつもりでした。そこで、signed_requestに対応しているのか確認したところ、どうも出来ないような感じ。signed_requestのためだけに大きなパッケージを導入してドキュメントやソースとにらめっこするのもどうかと思い、今回はスクラッチ(という名のコピペ)で対応することに方針転換。

参考にしたのは以下のコード。

上記を参考に、未認可ユーザなら認可をもらい(促し)、認可済ユーザならそのまま利用を許すところの機能を作ったわけですが、これが手間取りました。Canvas Pageのアプリは以前に作ったことがあるのですが、かなり前に一度だけだったのですっかり忘れています。

  • Canvas Pageではアプリケーションをiframeで読み込む
  • iframeでの最初の読み込みはPOSTで行われ、パラメータsigned_requestがついてくる
  • signed_requestは暗号化されており、中には認証情報などが含まれている
    • そのアプリケーションが認可済みなら、user_idとoauth_tokenが含まれているので、それで認可済みか判断できる

というあたりは覚えていました。

  • iframeの中で認可ダイアログのページ(https://www.facebook.com/dialog/oauth)に遷移すると「Facebookに移動」という様なボタンが出て一時停止
    • top.location.hrefを使って遷移させるのが一般的
  • 認可ダイアログからの戻りは、アプリケーションのドメインのURLなのでCanvas Pageから出て行ってしまう
    • 認可成功ならcodeパラメータ、失敗ならerrorパラメータがついてる
    • 今回はCanvas Page以外で使う予定はなかったので、topとwindowが一致したらCanvas Pageに遷移する様にしてしまった
      • Canvas Page移動後にsigined_requestを確認すれば認可済みか分かる

iframe内でLocationヘッダを使ったリダイレクトで認可ダイアログをノンストップで表示させようとしたらブレーキがかかったり、認可後にアプリのページに飛んでしまってどうするのが正規手続きなのか分からず悩んでみたり。眠い頭で大混乱でした。

一通りチュートリアルに書かれているので、ちゃんと読み取る力があれば、自分みたいなことにはならないでしょう。

そんなこんなで、パーミッションを得るだけの入り口部部で相当時間を使ってますよ、っと。

P.S. expressのmiddlewareとして実装したのは案外簡単にやれたんですけどね。