この記事はアピリッツの技術ブログ「DoRuby」から移行した記事です。情報が古い可能性がありますのでご注意ください。
先日、お客様から「OAuthに対応できますか?」という質問を受けました。
正直「OAuthって何?」 という感じだったので、ちょっと調べてみました。
☆OAuthとは・・・
→認可情報の委譲のための仕様
-予め信頼関係を構築したサービス間で
-ユーザの同意のもとに
-セキュアにユーザの権限を受け渡しする
とあります。
なんかOAuthには3つの要素が存在するようです。
-OAuth Service Provider(ユーザの認可情報を第3者に渡す)
-OAuth Consumer(ユーザの認可情報を受け取り、ユーザに代わっていろんな情報へのアクセス、追加・削除を行う)
-User(ProviderがConsumerに認可情報を渡すことを許可したり、認可情報を無効化する)
mixiの「友人を探す」の「アドレス帳から探す」でOAuthを使っているそうなので、それに当てはめると・・・
↓
ユーザ(User)の許可のもと、mixi側(OAuth Consumer)にGoogle(OAuth Service Provider)のGmailのアドレス帳へのアクセス権限を与えて、mixi内にマイミクに追加するためのアドレス帳のインポートが出来る
・mixiにGmailのアカウントやパスワードを渡す必要がありません
・ユーザはGmail内において、mixiを認証済みのウェブサイトから外すことで、mixiへの認可情報の受け渡しを無効化出来ます
なんとなく安全なのかなぁ~程度。。。
☆OAuth Providerの実装
お客様の話を聞いていると、どうもサイト内の友達情報とかをConsumerとなるゲーム側に受け渡すためにOAuthを使い、サイト=Providerという形にしたいっぽかったので、そもそもRailsのアプリにOAuthのProviderを取りこめるのか調べてみると・・・
Railsにruby-oauth gemと、OAuth Pluginというのがあって、それを使えば簡単にProvider側を実装できるらしいです。。。
◆ruby-oauth gemのインストール
gem install oauth
◆アプリにpluginをインストール(Railsアプリ配下で)
./script/plugin install git://github.com/pelle/oauth-plugin.git
◆Controller、Modelの作成
./script/generate oauth_provider
これにより、以下のファイルが出来ます
app/controllers/oauth_controller.rb
app/models/oautht_token.rb
app/models/access_token.rb
app/models/request_token.rb
app/models/client_application.rb
app/models/oauth_nonce.rb
◆routesとassociationを設定
map.oauth ‘/oauth’,:controller=>’oauth’,:action=>’index’
map.authorize ‘/oauth/authorize’,:controller=>’oauth’,:action=>’authorize’
map.request_token ‘/oauth/request_token’,:controller=>’oauth’,:action=>’request_token’
map.access_token ‘/oauth/access_token’,:controller=>’oauth’,:action=>’access_token’
map.test_request ‘/oauth/test_request’,:controller=>’oauth’,:action=>’test_request’
—-
has_many :client_applications
has_many :tokens, :class_name=>”OauthToken”,:order=>”authorized_at desc”,:include=>[:client_application]
—-
rake db:migrate
これにより、OAuth Service Providerの最低限の機能は揃うそうです。
また、下記のbefore_filterが使えるとのこと
・before_filter :login_or_oauth_required
・before_filter :oauth_required
でも、このプラグイン(Provider)を使うためには、よくよく調べてみるといろいろな条件があるようです。
・login_requiredを使っている
・rails2.0を使っている(←これが結構大きい・・・)
・OAuth Consumerの管理において、Consumerの削除・編集の機能実装が必要(え?結構重要じゃん)
既存のサイトに導入するのは結構難しそうですが、趣味とかで組んでみるのには面白そうですね☆