先日 リリースされた Spring Social について,InfoQ ではプロジェクトリーダの Craig Walls 氏に話を聞いた。最初の質問は,Spring Social 開発の背景となった動機に関してである。
Craig Walls: 人々が自らのアイデンティティをいろいろな面で主張できる場所が,オンラインの世界にはたくさんあります。Facebook や Twitter のように人々を友人や家族と結び付けて,生活の一部を共有させてくれるソーシャルネットワークサイトもそうですが,一方で "ソーシャル" とは見なされない,例えば Dropbox のようなサービスでも,個人のオンラインプレゼンスの一部であるリソースを保持しているのです。
このようなサービスの多くには REST API が用意されています。これによってサービスのコア機能以上の方法で,ユーザがこの種の情報を操作できるアプリケーションが作成可能になります。7億5000万以上の Facebook ユーザ,2億以上の Twitter ユーザ,さらに他のサービスにも同じくらいの巨大なユーザ数があることを考えれば,ユーザのソーシャルないしオンラインエクスペリエンスに接続するアプリケーションの開発,という大きなチャンスがそこにあることは明らかです。
その一方で,この種のアプリケーション構築には難しい面があります。REST API を使いこなすのは簡単なのですが,それに先だってユーザリソースへのアクセス許可を取得しなければなりません。そして一度許可を手に入れたら,ユーザにアクセス承認を再度求めなくても済むように,コネクションを長く利用できるように維持したいと思うでしょう。さらにサービスコールを実行すれば,そのレスポンスをモデルオブジェクトに結び付ることや,あるいは発生するかも知れないエラーへの対処も必要になります。
Spring Social はサービスプロバイダに接続するアプリケーションの開発を簡易化するために開発されました。接続プロセスの各処理を実行して,サービスの REST API の Java バインディングを提供します。
InfoQ: Spring Social コネクタを組み込むアプリケーションとしては,どのようなものを想定されていますか?
Craig Walls: Spring Social は,ユーザに代わってひとつないし複数のサービスプロバイダとの情報交換が必要なアプリケーションすべてに対して完璧にフィットします。ユーザの Twitter ストリームを読む,あるいはユーザの Facebook アカウントに写真をポストするといった単純な利用方法もこれに含まれるでしょう。
しかしアプリケーションによっては,ユーザのエクスペリエンスを拡張するような,もっと面白いことができるかも知れません。例えば音楽ストリーミングアプリケーションが Spring Social を使って,ユーザが "いいね!" と指定したミュージシャンのリストを取得すること,その情報をもとにユーザの音楽プレイリストをあつらえること,などが考えられます。さらにその音楽サービスが TripIt の旅行日程を参照して,旅行を予定している都市でのコンサートや音楽イベントに関して通知をするようなこともできるでしょう。
ユーザが自身のオンラインエクスペリエンス全体を向上させるためにアプリケーションからのアクセスを承諾したデータには,それを活用する上での創造性に限界はありません。この世界で作業をしていて,それがとても面白い部分です。
InfoQ: Spring Social は OAuth プロバイダと強く関連しているように思われますが,Spring Social プロバイダはすべて OAuth ベースでなければならない,という要件があるのでしょうか?
Craig Walls: Spring Social 1.0.0 では,ユーザリソースのセキュリティ確保に OAuth を使用しているプロバイダとの接続を直接的にサポートしています。対象となるのは OAuth 1.0,OAuth 1.0a,そして OAuth 2 です。Twitter や Facebook,TripIt,GitHub,Foursquare,Gowalla などの有名なものも含めて,サービスプロバイダの大半は OAuth を実装しているので,これで多くの領域がカバーされることになります。
さらに Spring Social の接続フレームワークには拡張性があるので,他の認証プロトコルを使用するサービスプロバイダをサポートするように拡張することも可能です。
InfoQ: OAuth 1.0 と OAuth 1.0a の違いは何でしょう?
Craig Walls: OAuth 1.0 にはセキュリティホールがありました。攻撃者がリクエストトークンを獲得するために接続プロセスを開始して,被害者をだましてそれを承認させることによって,最終的に被害者のリソースにアクセスするための認証プロセスを完了することができたのです。OAuth 1.0a 仕様ではこのセキュリティホールがふさがれています。
残念ながら現在でも OAuth 1.0 を使用しているプロバイダがいくつかあります。ただしその大部分は,OAuth 1.0 から OAuth 2 に移行するロードマップをすでに持っています。移行までの期間については,リクエストトークンの寿命を短くする(通常は数分)ことで先ほどのような攻撃を困難にできると考えられます。リスクを軽減する手段としてはその他に,OAuth 1.0 に独自の追加的制限 (コールバック URL は前もって登録されたのものでなければならない,など) を実装しているものもあります。さらにいくつかのプロバイダでは,アクセスを要求するアプリケーションが確認できるものである場合にのみ承認を行うよう,ユーザに警告するステップも用意しています。
Spring Social は OAuth 1.0 をサポートすることで,そのようなプロバイダとの接続を可能にしています。その中には TripIt や DropBox など有名なものも含まれています。OAuth 1.0 プロバイダと接続するアプリケーションを開発する場合には,そのような問題を認識しておくことも必要でしょう。
InfoQ: Twitter (あるいはその他) に必要な秘密鍵は,暗号化してデータベースに保存するのが理想的ですが,Spring Social はこれをサポートしているでしょうか?
Craig Walls: もちろんです! アプリケーションに与えられたアクセストークンとシークレットは,ユーザのプロバイダリソースをアクセスするために利用されるので,のぞき見ることができないようにしておく必要があります。そのためには Spring Social 接続リポジトリの設定で,トークンとシークレットの永続化で接続リポジトリが利用する暗号処理機構を設定しておかなければなりません。暗号処理の機構は,Spring Seculity の TextEncryptor インターフェースを実装していれば,どのようなものでも利用できます。サンプルでは学習上の便宜も考慮して,処理のないテキスト暗号機構を使用していますが,製品アプリケーションではもっと強力な暗号を使うべきでしょう。
InfoQ: 最後になりますが,OAuth の本質や Three-legged ブラウザベース認証を考えると,Spring Social はおもにブラウザを端末とする Web ベースシステムのためのものなのでしょうか,あるいはヘッドレスシステムにも適用できるのでしょうか?
Craig Walls: Spring Social 1.0.0 がサポートするのは,OAuth 1 と OAuth2 フローのユーザに関係する部分で,一般的には 3-legged OAuth 1,あるいは OAuth2 で Authorization Grant および Implicit Grant フローとして知られているものです。これらのフローではすべて,認証のためにユーザの使用するブラウザをリダイレクトします。
ただしこれは,Spring Social を使用するアプリケーションが Web アプリケーションでなければならない,という意味ではありません。例えば Android アプリケーションは Web アプリケーションではありませんが,プロバイダへの接続に Spring Social を使用できます。その場合, Android デバイスの Web ブラウザを使う必要があるのは認証目的だけであり,アプリケーションの他の部分は完全なネイティブでもよいのです。
ヘッドレスアプリケーションでは 2-legged OAuth 1 ("signed fetch" とも呼ばれます),あるいは OAuth 2 の Resoure Owner Password Credential や Client Credential など,ユーザが関与しない他の認証スキームが使用されると思います。Spring Social の 1.0.0 リリースではこれらのスキームをサポートしていませんが,将来のリリースについて検討しているところです。
Spring Social のホームページでは,提供中の追加コネクタのリストなど,さらに詳細な情報が提供されている。1.0 リリースでは Facebook や Twitter 用のコネクタが用意されている。その他にも現在開発中のもの (GitHub や TripIt,Linked In など) や,コミュニティ主体で進められている Foursquare や Instagram 用のものがある。Spring Social に関してさらに疑問があれば,以下のコメントにその内容を記してほしい。