Your SlideShare is downloading. ×
0
OpenID with Rails
OpenID with Rails
OpenID with Rails
OpenID with Rails
OpenID with Rails
OpenID with Rails
OpenID with Rails
OpenID with Rails
OpenID with Rails
OpenID with Rails
OpenID with Rails
OpenID with Rails
OpenID with Rails
OpenID with Rails
OpenID with Rails
OpenID with Rails
OpenID with Rails
OpenID with Rails
OpenID with Rails
OpenID with Rails
OpenID with Rails
OpenID with Rails
OpenID with Rails
OpenID with Rails
OpenID with Rails
OpenID with Rails
OpenID with Rails
OpenID with Rails
OpenID with Rails
OpenID with Rails
OpenID with Rails
OpenID with Rails
OpenID with Rails
OpenID with Rails
OpenID with Rails
OpenID with Rails
OpenID with Rails
OpenID with Rails
OpenID with Rails
OpenID with Rails
OpenID with Rails
OpenID with Rails
OpenID with Rails
OpenID with Rails
OpenID with Rails
OpenID with Rails
OpenID with Rails
OpenID with Rails
OpenID with Rails
OpenID with Rails
OpenID with Rails
OpenID with Rails
OpenID with Rails
OpenID with Rails
OpenID with Rails
OpenID with Rails
OpenID with Rails
OpenID with Rails
Upcoming SlideShare
Loading in...5
×

Thanks for flagging this SlideShare!

Oops! An error has occurred.

×
Saving this for later? Get the SlideShare app to save on your phone or tablet. Read anywhere, anytime – even offline.
Text the download link to your phone
Standard text messaging rates apply

OpenID with Rails

4,115

Published on

Published in: Technology
0 Comments
1 Like
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total Views
4,115
On Slideshare
0
From Embeds
0
Number of Embeds
2
Actions
Shares
0
Downloads
39
Comments
0
Likes
1
Embeds 0
No embeds

Report content
Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
No notes for slide

Transcript

  • 1. Ruby on Railsで作るOpenID対応サイトIdentity Conference #3MATSUOKA Kohei <kohei@machu.jp> 1
  • 2. 今日のテーマRailsでOpenID対応サイト (RP) を作るには?Railsをつかって駆け足でRPを作成しますセキュリティやSREGでの属性取得も少々そろそろマイミク認証について一言いっておくか 2
  • 3. 背景2007年以降、OpenID発行サイトが充実 はてな、livedoor、Yahoo! Japan、そしてmixiでも、対応サイトが少ないRailsを使ってRPサイトを作ってみよう 3
  • 4. 宣伝gihyo.jpいますぐ使えるOpenID http://gihyo.jp/dev/ feature/01/openid 4
  • 5. 作成するアプリ簡単なチャット OpenIDでログイン mixiのニックネーム を取得 マイミク認証Mac OS X +NetBeans 6.1で開発 5
  • 6. NetBeans統合開発環境 JRuby, CRuby, Rails サーバの起動停止 コード補完なかなか便利
  • 7. ライブラリのインストールOpenIDを利用するために必要なライブラリとプラグインを導入します 7
  • 8. アプリの構成Ruby 1.8.6-p111, Ruby on Rails 2.1 ruby-openidライブラリ Restful Authenticationプラグイン OpenID Authenticationプラグイン 8
  • 9. ruby-openidsudo gem install ruby-openidRubyでOpenIDを扱うための基本的なライブラリ http://openidenabled.com/ruby-openid/ PHP, Pythonにも同様のライブラリあり 9
  • 10. Railsプラグインの導入プロジェクトを右クリックして、「Railsプラグイン」を選択 10
  • 11. RESTful Authentication認証機能の枠組み 処理 メソッド パスRESTfulな設計 ユーザ登録 POST /usersOpenID Authプラ ログイン POST /sessionsグインと組み合わせて利用 ログアウト DELETE /sessions 11
  • 12. OpenID Authentication ruby_openidライブラリのRails向けラッパー OpenID Providerとのやりとりを担当authenticate_with_open_id do ¦result, identity_url¦ if result.successful? # 認証成功 else # 認証失敗 end 12
  • 13. 5分でできる(ryサンプルの認証機能以外を作成します。よくあるRailsチュートリアルと同じです。 13
  • 14. チャットのひな形を作成script/generate scaffold message title:stringrake db:migratescript/server -> Railsサーバ (mongrel) が起動 14
  • 15. チャットのひな形を作成画面をチャット風に修正 15
  • 16. 認証機能の組み込みRESTful Authenticationプラグインを使ってアプリに認証機能を組み込みます 16
  • 17. RESTful Authentication認証のためのひながたを作成できる./script/generate authenticated user sessions 17
  • 18. 自動生成されるファイル 種別 名称 役割 モデル User ユーザ情報を保存 UsersController ユーザ登録コントローラ SessionsController ログイン、ログアウト users/new ユーザ登録画面 ビュー sessions/new ログイン画面 18
  • 19. ユーザ登録画面遷移 /users/newチャット /messages ログイン /sessions/new 19
  • 20. 認証と認可class ApplicationController < ActionController::Base include AuthenticatedSystemclass MessagesController < ApplicationController before_filter :login_required, :except => [:index, :show] チャットの書き込みにはログインが必要 AuthenticatedSystemをインクルード フィルタでlogin_requiredメソッドを呼び出す 20
  • 21. AuthenticatedSystemコントローラに login_requiredincludeして使用 authorized? 認可認証と認可に必要なメ logged_in?ソッドを定義 ログインの有無を判定メソッドをオーバーラ NGイドすることでカスタ access_deniedマイズ可能 アクセス拒否時の動作を定義 21
  • 22. OpenID認証への対応OpenID Authenticationプラグインを使ってパスワード認証からOpenID認証へ変更します 22
  • 23. OpenID認証への対応RESTful Authenticationプラグインで作成したひながたを元にOpenID認証に対応します変更箇所 データベース ログイン処理(コントローラ) ログイン画面、ユーザ登録画面(ビュー)
  • 24. データベースの更新OpenIDライブラリが使用するテーブルを自動生成rake open_id_authentication:db:create open_id_authentication_associations open_id_authentication_nonces 24
  • 25. データベースの更新usersテーブルにidentity_url属性を追加 OpenIDのVerified Identifierを保存するためrake db:migrateを実行してDBスキーマを更新 25
  • 26. ログイン画面遷移 チャット ログイン ユーザ登録 処理※ ログイン→ユーザ登録となる 26
  • 27. ログイン処理の修正パスワード認証をOpenID認証へSessionsコントローラのcreateメソッドを修正 OpenID AuthenticationのREADMEを参考認証成功時に処理を分岐 ユーザ登録済 → セッションCookie発行 ユーザ未登録 → ユーザ登録画面へ 27
  • 28. ログイン処理の修正authenticate_with_open_id do ¦result, identity_url¦ if result.successful? if @current_user = User.find_by_identity_url(identity_url) 認証成功 successful_login else → Cookie発行 # identity_url (Verified Identifier) をセッションに保存 session[:identity_url] = identity_url 認証成功(未登録) # ユーザ登録画面へリダイレクトする redirect_to new_user_path → ユーザ登録へ end else # 認証失敗 認証失敗 flash[:notice] = result.message render :action => new → ログイン画面へ end end※ OPへのリダイレクト処理は記述不要 28
  • 29. ログイン画面の修正OpenIDのアカウント名を入力お好みで「○○でログイン」ボタンを追加
  • 30. ユーザ登録画面の修正ニックネームのみ入力してもらうidentity_urlはセッションCookieから取得するセッションCookieを持たないユーザを拒否 30
  • 31. セキュリティRPの基本的なセキュリティ対策であるSSL対応(サーバ証明書の検証)について 31
  • 32. http://d.hatena.ne.jp/ZIGOROu/20080805/1217933206 32
  • 33. SSL対応の発行サイトmixi.jp でログイン → ログに警告が出力WARNING: making https request to https://mixi.jp/xrds_server.pl without verifying server certificate; no CA path was specified.サーバ証明書を発行したCAを信頼していないためでも警告だけで使えてしまう>< DNS Cache Poisoningされるとアウト 33
  • 34. 証明書を検証しないSSLはほとんど無意味cf. オレオレ証明書
  • 35. SSLを 正しく 利用する信頼していないCAへの接続は拒否するOpenID.fetcher.ca_fileにCAのリストを設定 config/environment.rb あたりに記述 cURLのCAリストを使用した OpenID.fetcher.ca_file = /usr/share/curl/curl-ca-bundle.crt 35
  • 36. SSLを 正しく 利用するOpenID.fetcher.ca_fileを設定mixi.jpにログイン 警告ではなくエラーで停止信頼していない証明書は受け入れない [OPENID] Failed to fetch Yadis URL https://mixi.jp/xrds_server.pl : Error connecting to SSL URL https://mixi.jp/xrds_server.pl: certificate verify failed 36
  • 37. mixiの場合id.mixi.jpとmixi.jpでルート証明書が異なる id.mixi.jp … GTE CyberTrust Global Root mixi.jp … AddTrust External CA RootMac OS XのcURLはAddTrustが含まれていない Netscape Communicator 4.7の証明書リスト他のOSでは入っている証明書リストが異なる
  • 38. 証明書リストに追加(1)「信頼できる経路」を使ってルート証明書を取得 今回はfirefoxを使うmixi.jpに接続CA (AddTrust) の証明書を選択し、「書き出す」 38
  • 39. 証明書リストに追加(2)BEGIN CERTIFICATEと -----BEGIN CERTIFICATE----- MIIENjCCAx6gAwIBAgIBATANBgkqhk書かれたファイル <略> これがCAの証明書 1Z5jJh5VkpTYghdae9C8x49OhgQ= -----END CERTIFICATE-----CAリストの末尾にこのテキストを貼り付ける警告もエラーも出ずにログインできるようになる! 39
  • 40. 参考ruby で mixi OpenID を呼ぶには http://d.hatena.ne.jp/n_shuyo/20080911/mixi_openidphp-openid で mixi のコミュニティ認証を使う http://www.machu.jp/diary/20080918.html#p01面倒でもちゃんと設定しましょう 40
  • 41. SREGで属性情報を取得SREG拡張でmixiユーザのニックネームを取得します 41
  • 42. mixiのニックネームを取得ユーザ登録時のニックネームの初期値に利用メールアドレスが取得できると便利なのに… 42
  • 43. mixiのニックネームを取得引数に :optional => :nickname を追加するだけ authenticate_with_open_id(params[:openid_url], :optional => :nickname) do ¦result, identity_url, registration¦ if result.successful? if @current_user = User.find_by_identity_url(identity_url) successful_login else # identity_url (Verified Identifier) をセッションに保存 session[:identity_url] = identity_url session[:nickname] = registration[nickname] # ユーザ登録画面へリダイレクトする redirect_to new_user_path end 43
  • 44. マイミク認証mixi独自のマイミク認証を使ってみましょう 44
  • 45. マイミク認証とは? 自分が誰かのマイミクであることを認証 普通のOpenIDと同じ仕組みで実現!まちゅさんのマイミクhttps://id.mixi.jp/1741395/friends/ 45
  • 46. マイミク認証の例
  • 47. マイミク認証の手順identity_urlからmixiのユーザIDを取得 https://id.mixi.jp/1741395/後ろにfriends/を付与してClaimed Identityを生成 https://id.mixi.jp/1741395/friends/authenticate_with_openidメソッドでマイミク認証 47
  • 48. 認証処理のコードidentity_urlの生成以外は普通のOpenID認証と同じclass FriendsController < ApplicationController def show @user = User.find(params[:user_id]) if @user.identity_url = %r¦^https://id.mixi.jp/d+¦ identity_url = "#{@user.identity_url}/friends" authenticate_with_open_id(identity_url) do ¦result, identity_url¦ unless result.successful? flash[:notice] = "あなたはマイミクではないようです!" redirect_to / end end 48
  • 49. マイミク認証の考察マイミク認証&コミュニティ認証の落とし穴・注意点を提起します 49
  • 50. マイミク認証のおさらいマイミク認証 まちゅさんのマイミクhttps://id.mixi.jp/1741395/friends/コミュニティ認証ニコニコ動画コミュニティの参加者https://id.mixi.jp/community/1651291/RPからは普通のOpenIDアカウントと同じにみえる 50
  • 51. コミュニティIDでユーザ登録してみる https://id.mixi.jp/community/1651291/ 51
  • 52. 登録できた… 52
  • 53. これって、みんなで使える共通アカウントが作れる?
  • 54. そんなことはありません User Supplied Identifierログイン前 https://id.mixi.jp/community/1651291/ User Claimed Identifier (openid.claimed_id) https://id.mixi.jp/community/1651291/1741395ログイン後 個人のID User Verified Identifier (openid.identity) https://id.mixi.jp/1741395
  • 55. Claimed ID or Verified ID サービス Claimed ID Verified ID mixi認証 https://id.mixi.jp/1741395 https://id.mixi.jp/1741395 https://id.mixi.jp/community/コミュニティ認証 1651291/1741395 https://id.mixi.jp/1741395 https://id.mixi.jp/29704/ マイミク認証 friends/1741395 https://id.mixi.jp/1741395 delegate http://www.machu.jp/ https://id.mixi.jp/1741395 55
  • 56. 参考Relying PartyとIdentityの関連づけについて http://d.hatena.ne.jp/ZIGOROu/20080204/1202115281RPはClaimed IDを紐づけるのが正解との結論 56
  • 57. 結論間違ってもUser Supplied Identifierは記録しない OpenID Authenticationプラグインを使うとUser Claimed IDが記録されるコミュニティ認証やマイミク認証のIDでのユーザ登録を拒否したければ、RPで個別対応 ここだけClaimed IDではなくVerified IDを記録
  • 58. おしまい 58

×