tl;dr
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変えたばっかで入ってなかった