decadence

個人のメモ帳

SecureSocial 3.0 について

tl;dr

  • SecureSocialはPlay版のdevice+omniauthのような認証・認可ライブラリ
  • SecureSocial 3.0 milestone 1が出ている
    • Play 2.3にも使える安定版が...?
    • SecureSocial 2.x と比べてAPIがそこそこ変わって便利
  • 既存のOAuthProviderとは別にはてなOAuth認証を試す

jaliss/securesocial · GitHub

SecureSocialとは

Play Framework - Build Modern & Scalable Web Apps with Java and Scalaで使える認証・認可ライブラリ
Play1にもPlay2にも、JavaからでもScalaからでも使える
パスワード認証から、様々なOAuth認証にも対応しており、deviceのconfirmationのような機能も楽に使う事が出来る
ライブラリで対応するOAuthサービスは安定版にはまだ入ってないものもあるが、以下の通り

Dropbox, Facebook, Foursquare, GitHub, Google, Instagram, LinkedIn, Twitter, Vk, Weibo, Xing

Playでも使えるの認証・認可ライブラリといえば、(特にScala側から見て)

あたりもメジャーで、SecureSocialがフルスタックみたいな感じになってる
後にも述べるが、SecureSocial3.0では、複数サービスを1ユーザに連携させる機能とかが加わって便利
国際化にも勝手に対応しててやっぱり便利
RailsのDeviceと違い、永続化層に対してはAPIのみ提供するので、実装についてはメモリに保存させたりDBに入れたりと勝手にする

SecureSocial動向

公式サイトに書いているが、安定版として出ているのは以下の通り

SecureSocial version Play version
2.1.4 2.2.x
2.1.1 2.1.x
2.0.13 2.0.6
0.2.6 1.x

先日のメール にある通り、現在のmasterブランチにあるものがSecureSocial3.0 milestone 1になる
以前のversionに比べてAPIがそこそこ変わってるので4つの観点から軽く述べたいと思う

  • 単なるsbtサブプロジェクト化
  • test-kitの追加
  • linkメソッドの追加
  • ユーザ情報
単なるsbtサブプロジェクト化

SecureSocial 2.x はそもそもPlayPluginを中心として実装されていた
そのため、play.pluginsに10行ぐらい加えるなどの苦行を強いられた
もちろん中身はPlayのプロジェクトなのだが、この変化に釣られて以下のような点で変更が必要になる

  • play.pluginsにはメールプラグインのみの記述でよい
  • routesにはサブプロジェクトへのroutesを参照する記述を加えるだけでよい
    • -> /auth securesocial.Routes
  • RuntimeEnvironmentの実装をカスタマイズ

最後が変更が2.1.4などを使ってた人からすると大きい
以前はUserServicePluginというPlay Pluginを実装すれば終わりだったのだが、こちらのサンプルを見て貰えば分かるのだが、RuntimeEnvironmentを拡張する事でSecureSocial全体のコントローラを作成する
以前に作ったUserServiceは、RuntimeEnvironmentが持つ値になる

test-kitの追加

こちらの変更でテストヘルパーが追加された
WithLoggedUser.cookie、ありがたい

linkメソッドの追加

Play2.2.xの安定版であるSecureSocial2.1.4には存在しないが、2.1.xブランチには存在してる便利メソッド`link`
UserServiceに対して生えるものだが、1人のユーザに対して、複数のサービスを連携させる代物
使い方などサンプルを見るのが一番

ユーザ情報

以前はIdentity traitをユーザ情報引き回すのに用いていたのだが、BasicProfileというcase classを引き回す仕様に変わった
case classは継承出来ないからtraitのままの方が良かったのではないかとかいう所感
UserSerfice.findからBasicProfile返ってきたりするけど、サンプルで言うDemoUserにマッピングする事も可能なので、特に使う上で問題はないけど変

SecureSocial 3.0 を使う + はてなOAuth認証を加える

ここからは、最新のSecureSocialを軽く触れるついでに遊びでライブラリが提供していないOAuthサービスをどのようにして使うのかを試す

そもそもの内容は、viewsやら書くの面倒なのでsecuresocial/samples/scala/demo at master · jaliss/securesocial · GitHubをそこそこコピペする
変更点について、Gist - SecureSocial 3.0(milestone 1) with Custom OAuth Providerに載せた

consumer登録は予めこちらから済ませておく
ユーザ情報の取得ははてなの OAuth アプリケーション用 API - Hatena Developer Centerを利用

  • master-SNAPSHOTを使うのでresolversにsnapshotsを加える
  • JDK1.6では動かないのでJDK1.7↑にする*1
  • HatenaのOAuthはOAuth1なので、Providerの実装は他のOAuth1を真似る
  • 同様にconfに書く内容も他のOAuth1のを真似る(認証毎にキーが固定されてるので注意)
  • RuntimeEnvironment.Defaultのprovidersはvalで定義されてるので、既存のものを必要分だけ取り出して上書きした
  • 後は、その際に今回新しく加えたHatenaProviderを使うように指示すればはてなOAuthでの認証が出来る

今回はサンプルのInMemoryUserServiceを使ったが、データベースに保存したいといった要望も多いと思う
基本的にBasicProfileに含まれた情報を保存する事になるのだが、例えばSlickを使うとなると、マッピングを書くのがそこそこしんどい
古い記事だが大体こんな感じになると思う Lunatech Blog: Play 2, SecureSocial and Slick

出来ればあまり書きたくないってのが本音

*1:PC変えたばっかで入ってなかった