6/26のFacebook Night Vol.7で登壇しましたので、発表内容をまとめておきます。
話した内容はざっくり以下の3点です。

  • 混同してしまうpublish_streamとpublish_actionsパーミッションの違いを、最近の仕様変更をふまえて紹介する
  • 認証ダイアログの1ページ目と2ページ目の違いと、先述したパーミッションの扱いの違い
  • 実装に落とし込む

30分の発表時間に対して若干詰め込みすぎな感じがありましたので、スライドや発表内容から削った部分も補足しつつ3エントリーに分けて紹介します。

パーミッション取得の現状と問題点

実装の最初の段階でしか考えない

まず現状として、ユーザからのパーミッション取得はアプリのインストール時(利用開始時)の認証ダイアログに頼っている場合が多いと思います。ユーザがログインボタンを押すと以下のようなURLへリダイレクトされ、Facebook認証ダイアログが表示されるような使い方です。
https://www.facebook.com/dialog/oauth?
    client_id=YOUR_APP_ID
   &redirect_uri=YOUR_REDIRECT_URI
   &scope=COMMA_SEPARATED_LIST_OF_PERMISSION_NAMES
   &state=SOME_ARBITRARY_BUT_UNIQUE_STRING
ユーザがアプリをインストールすればscopeで指定したパーミッションが許可され、その権限に従ってアプリはユーザの代理として情報の読み書きが出来ます。ここでパーミッションを取得する仕組みを作り、あとは機能の実装となる為、認証部分の実装以降はパーミッションの扱いはないがしろになってしまいます。

それでも仕様変更は多い

後から見返すことは少ないとはいえ、直近数ヶ月だけでも大きめの変更はたくさんあります。
offline_access廃止に関してはすでに色々な方が話されているので、ここではpublish_streamとpublish_actionsの変更と認証ダイアログの移行についておさらいします。

publish_actionsとpublish_streamパーミッションの変更

以前の仕様

publish_actionsパーミッションは去年9月のf8(参加レポート:Facebook f8に参加してきました!)で発表されたOpen Graphアクションの実装用に追加されたパーミッションで比較的新しい物です。これを取得することで、ユーザのタイムラインに対してOpen Graphアクションを投稿することが可能となります。
それに対しpublish_streamは昔からある物で、ユーザ自身のウォール、友だちのウォール、グループやイベントへ投稿したりできるほか、コメントに対していいね!できるなど、投稿系で必要とされるパーミッションです。
ここで問題となったのは、アプリで画像を生成してそれをユーザのウォールに投稿し、同時にユーザのタイムラインにもOpen Graphアクションを投稿しようとした場合、publish_streamとpublish_actionsパーミッションの両方を求める必要があったという点です。これらの背景については、publish_streamとpublish_actionsパーミッションの統合というエントリーで紹介しています(統合という表現を選んだのを後悔してます)。

変更後の仕様

以前の仕様の問題点を克服するため、publish_actionsとpublish_streamの位置づけが大きく変わりました。それぞれのパーミッションでできることを一覧にしてみます。
publish_actionsでできること
  • Open Graphアクションの投稿
  • ユーザ自身のウォールに投稿
  • ビデオ / 画像の投稿(アルバム作成を含む)
  • ビデオ / 画像へのタグ付け
  • フィードに対していいね! / コメント
publish_streamでできること
  • publish_actionsの全て
  • 友だちのウォールに投稿
  • クエスチョンを投稿
  • ノートを投稿
  • イベント / グループに投稿
見ると分かる通り、publish_actionsはpublish_streamの一部という扱いになった為、publish_streamは publish_actionsの持つ全ての権限を持っています。また、publish_actionsはユーザ自身のウォールに投稿したり、コメント を書き込めるなどの書き込み権限も与えられています。旧仕様に従ってpublish_streamを求めたままになっているアプリでも、大体はpublish_actionsさえ要求すれば事足りるということが分かります。
とりあえずpublish_streamを要求しておけばpublish_actionsの権限もカバーできるので楽ですが、友だちのウォールにまで投稿されてしまうかもしれないpublish_streamと、自分のウォールに限定されるpublish_actionsでは、ユーザにとっての不安の度合いは大きく変わるはずです。1部のスパムアプリのせいでFacebookアプリ全部が疑われてしまうと心配するだけでなく、自分たちも必要最小限のパーミッションのみ要求し、ユーザを不安にさせないアプリ作りをすることが必要なんじゃないかと思っています。

次の「Facebook Night Vol.7 発表内容まとめ 2:認証ダイアログの構成」では、移行後の新・認証ダイアログの構成と、ダイアログ上でのpublish_actions / publish_streamの扱いの違いを紹介します。