<?xml version="1.0" encoding="UTF-8"?>
<page xmlns="http://api.springnote.com">
  <identifier type="integer">862158</identifier>
  <title>[Rails] Openid &#49324;&#50857;&#54616;&#44592;</title>
  <relation_is_part_of type="integer">366736</relation_is_part_of>
  <date_modified type="datetime">2008-04-06T11:54:33Z</date_modified>
  <uri>http://aproxacs.springnote.com/pages/862158</uri>
  <date_created type="datetime">2008-02-26T14:37:26Z</date_created>
  <source>&lt;h4&gt;&#54616;&#44256;&#51088; &#54616;&#45716; &#44163;&#46308;&lt;/h4&gt;
&lt;p&gt;restful&amp;nbsp;authentication plugin&#44284; open_id_authentication plugin&#51012; &#51060;&#50857;&#54644;&#49436; openid&#47484; &#51060;&#50857;&#54620; login&#44284;&#51221;&#51012; &#44396;&#54788;&#54620;&#45796;.&lt;/p&gt;
&lt;p&gt;restful authentication&#51012; &#51060;&#50857;&#54644;&#49436; &#54924;&#50896; &#44032;&#51077; &#44284;&#51221;&#51008; &#44396;&#54788;&#54616;&#51648; &#50506;&#51012; &#44163;&#51060;&#45796;.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&#52395;&#48264;&#51704;&#47196; openid&#47484; &#51060;&#50857;&#54644;&#49436; &#47196;&#44536;&#51064;&#54616;&#45716; &#44032;&#51077;&#51088;&#45716; user table&#50640; &#51200;&#51109;&#54620;&#45796;. &#51060; &#46412; name&#44284; email&#46020; &#44057;&#51060; &#51200;&#51109;&#54620;&#45796;.&lt;/p&gt;
&lt;p&gt;&#47196;&#44536;&#51064; &#50500;&#51060;&#46356; &#44592;&#50613;&#54616;&#44592;(&#51088;&#46041; &#47196;&#44536;&#51064;) &#44592;&#45733;&#51012; &#44396;&#54788;&#54620;&#45796;.&lt;/p&gt;
&lt;p&gt;&#47196;&#44536;&#51064; &#51077;&#47141; &#52285;&#50640; openid &#47196;&#44256;&#47484; &#45347;&#45716;&#45796;.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h6&gt;gem&#44284; plugin&#51032; &#49444;&#52824;&lt;/h6&gt;
&lt;p&gt;ruby-openid gem &amp;nbsp;&#49444;&#52824;&#54620;&#45796;.&lt;/p&gt;
&lt;ol class="code"&gt;
&lt;li&gt;gem install ruby-openid&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://agilewebdevelopment.com/plugins/openidauthentication" title="http://agilewebdevelopment.com/plugins/openidauthentication" class="external"&gt;open id authentication plugin&lt;/a&gt; &#49444;&#52824;&#55180;&#45796;.&lt;/p&gt;
&lt;ol class="code"&gt;
&lt;li&gt;ruby script\plugin install open_id_authentication&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;a href="http://agilewebdevelopment.com/plugins/restful_authentication" title="http://agilewebdevelopment.com/plugins/restful_authentication" class="external"&gt;restful authentication plugin&lt;/a&gt; &#51012; &#49444;&#52824;&#54620;&#45796;.&lt;/p&gt;
&lt;ol class="code"&gt;
&lt;li&gt;ruby script\plugin install &lt;a href="http://svn.techno-weenie.net/projects/plugins/restful_authentication/"&gt;http://svn.techno-weenie.net/projects/plugins/restful_authentication/&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h6&gt;migration &#51012; &#51060;&#50857;&#54620; db table &#49373;&#49457;&lt;/h6&gt;
&lt;p&gt;restful authentication&#51032; generate&#47484; &#51060;&#50857;&#54644;&#49436; user&#50752; sessions&#47484; &#49373;&#49457;&#54620;&#45796;.&lt;/p&gt;
&lt;ol class="code"&gt;
&lt;li&gt;ruby script/generate authenticated user sessions&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&#50948; &#47749;&#47161;&#51008; user model &#44284; sessions controller, users controller &#47484; &#49373;&#49457;&#54620;&#45796;. users controller&#44032; &#54596;&#50836;&#50630;&#45796;&#47732; &#49325;&#51228;&#54644;&#46020; &#51339;&#45796;.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;user table&#50640; identity_url&#51012; &#52628;&#44032;&#54620;&#45796;.&lt;/p&gt;
&lt;ol class="code"&gt;
&lt;li&gt;# db/migrate/001_create_users.rb&lt;/li&gt;
&lt;li&gt;t.column :identity_url, :string&lt;/li&gt;
&lt;li&gt;t.column :name, :string&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;rake&#47484; &#51060;&#50857;&#54644;&#49436; open_id_authentication migration&#51012; &#52628;&#44032;&#54620;&#45796;.&lt;/p&gt;
&lt;ol class="code"&gt;
&lt;li&gt;rake open_id_authentication:db:create&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;db/migrate/002_add_open_id_authentication_tables.rb&amp;nbsp; &#54028;&#51068;&#51060; &#49373;&#49457;&#46108;&#45796;.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;migrate&#47484; &#49688;&#54665;&#54644; db table&#51012; &#49373;&#49457;&#54620;&#45796;.&lt;/p&gt;
&lt;ol class="code"&gt;
&lt;li&gt;rake db:migrate&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h6&gt;&#44592;&#53440; &#49444;&#51221;&lt;/h6&gt;
&lt;p&gt;application controller&#50640; &#45796;&#51020;&#51012; &#52628;&#44032;&#54620;&#45796;. &#44592;&#48376;&#51201;&#51004;&#47196; &#47784;&#46304; controller&#46308;&#51032; &#50836;&#52397;&#51060; login_required&#50640; &#51032;&#54644; login&#51012; &#50836;&#44396;&#54616;&#46020;&#47197; &#54616;&#44256; &#51080;&#45796;.&lt;/p&gt;
&lt;ol class="code"&gt;
&lt;li&gt;include AuthenticatedSystem&amp;nbsp;&lt;br /&gt;
before_filter :login_required&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;login&#51060; &#54596;&#50836;&#50630;&#45716; controller &#54841;&#51008; action&#50640; &#45824;&#54644;&#49436;&#45716; skip_before_filter&#47484; &#51060;&#50857;&#54624; &#49688; &#51080;&#45796;.&lt;/p&gt;
&lt;p&gt;sessions controller&#45716; login_required&#44032; &#54596;&#50836;&#50630;&#51004;&#45768; &#45796;&#51020;&#51012; &#52628;&#44032;&#54620;&#45796;.&amp;nbsp;&lt;/p&gt;
&lt;ol class="code"&gt;
&lt;li&gt;skip_before_filter :login_required&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;routes.rb&#47484; &#45796;&#51020;&#44284; &#44057;&#51060; &#54620;&#45796;.&lt;/p&gt;
&lt;ol class="code"&gt;
&lt;li&gt;map.resources :users&lt;br /&gt;
map.open_id_complete 'session', :controller =&amp;gt; "sessions", :action =&amp;gt; "create", :conditions =&amp;gt; { :method =&amp;gt; :get }&lt;br /&gt;
map.resource :session&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;map.open_id_complete&#45716; openid provider&#47196; &#48512;&#53552; &#51064;&#51613;&#51060; &#50756;&#47308;&#46104;&#50632;&#51020;&#51012; &#50508;&#47532;&#45716; request&#47484; sessions controller&#51032; create action&#51004;&#47196; &#48372;&#45236;&#44592; &#50948;&#54632;&#51060;&#45796;. &#51060; &#50836;&#52397;&#51008; open_id_authentication plugin&#50640;&#49436;&#45716; GET "/session?&#44033;&#51333;_&#54028;&#46972;&#48120;&#53552;&#46308;" &#51060;&#45796;. &#44536;&#47000;&#49436; /session&#50640; &#45824;&#54620; get &#50836;&#52397;&#51012; create action&#51004;&#47196; &#48372;&#45240;&#45796;. &#51060;&#44163;&#51060; &#47560;&#51020;&#50640; &#46308;&#51648; &#50506;&#45716;&#45796;&#47732; return_to&amp;nbsp;option&#51012; &#51312;&#51208;&#54644;&#49436; &#50896;&#54616;&#45716; &#44050;&#51004;&#47196; &#48148;&#44992; &#49688; &#51080;&#45796;. return_to option&#50640; &#45824;&#54644;&#49436;&#45716; &#48145;&#50640; &#45796;&#49884; &#49444;&#47749;&#54620;&#45796;.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h5&gt;view&#51032; &#44396;&#54788;&lt;/h5&gt;
&lt;p&gt;views/sessions/new.html.erb &#47484; &#45796;&#51020;&#44284; &#44057;&#51060; &#54620;&#45796;.&lt;/p&gt;
&lt;ol class="code"&gt;
&lt;li&gt;&amp;lt;%= stylesheet_link_tag "login"&amp;nbsp; %&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class="message"&amp;gt;&lt;br /&gt;
&amp;nbsp; &amp;lt;%= logged_in? ? "&#47196;&#44536;&#51064;&#46104;&#50632;&#49845;&#45768;&#45796;." : "&#47196;&#44536;&#50500;&#50883; &#49345;&#53468;&#51077;&#45768;&#45796;." %&amp;gt;&lt;br /&gt;
&amp;nbsp; &amp;lt;%= link_to "&#47196;&#44536;&#50500;&#50883;", session_url, :method=&amp;gt;:delete if logged_in?&amp;nbsp; %&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;% form_tag(session_url) do %&amp;gt;&lt;br /&gt;
&amp;nbsp; &amp;lt;label for="openid_url"&amp;gt;OpenID:&amp;lt;/label&amp;gt;&lt;br /&gt;
&amp;nbsp; &amp;lt;%= text_field_tag "openid_identifier", "", :class=&amp;gt;"openid" %&amp;gt;&lt;br /&gt;
&amp;nbsp; &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;nbsp; &amp;lt;%= check_box_tag 'remember_me' %&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;lt;label for="remember_me" class="rememberMe"&amp;gt;&#50500;&#51060;&#46356; &#44592;&#50613;&#54616;&#44592;&amp;lt;/label&amp;gt;&lt;br /&gt;
&amp;lt;% end %&amp;gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;ul&gt;
&lt;li&gt;login.css&#47484; &#54252;&#54632;&#54616;&#44256;,&lt;/li&gt;
&lt;li&gt;&#47196;&#44536;&#51064; &#50668;&#48512;&#47484; &#48372;&#50668;&#51452;&#44256;,&lt;/li&gt;
&lt;li&gt;openid&#47484; &#51077;&#47141;&#54624; &#49688; &#51080;&#45716; form&#51012; &#48372;&#50668;&#51452;&#44256;, &lt;a href="http://openid.springnote.com/pages/471141.xhtml" title="http://openid.springnote.com/pages/471141.xhtml" class="external"&gt;openid &#44428;&#51109; &#54364;&#51456; &#49828;&#53440;&#51068; &#44032;&#51060;&#46300;&lt;/a&gt;&#50640; &#46384;&#47476;&#47732; openid input&#51032; &#51060;&#47492;&#51012; openid_indentifier&#47196; &#54616;&#46972;&#44256; &#54620;&#45796;.&lt;/li&gt;
&lt;li&gt;&#50500;&#51060;&#46356; &#44592;&#50613;&#54616;&#44592; checkbox&#47484; &#48372;&#50668;&#51456;&#45796;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;login.css&#47484; &#45796;&#51020;&#44284; &#44057;&#51060; &#51089;&#49457;&#54644;&#49436; style&#51012; &#51456;&#45796;.&lt;/p&gt;
&lt;ol class="code"&gt;
&lt;li&gt;body {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; margin: 50px 0px 0px 0px;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; text-align: center;&amp;nbsp;&amp;nbsp;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; font-size: 14px;&lt;br /&gt;
}&lt;br /&gt;
div.message {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; margin: 10px 0px;&lt;br /&gt;
}&lt;br /&gt;
input.openid {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; background:transparent url(/images/openid_bg.gif) no-repeat left center;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; padding-left: 18px;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; border: 1px solid;&lt;br /&gt;
}&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;openid logo(openid_bg.gif)&#45716; &lt;a href="http://openid.net/logos/"&gt;http://openid.net/logos/&lt;/a&gt; &#50640;&#49436; &#51201;&#45817;&#54620; &#44163;&#51004;&#47196; &#45796;&#50868; &#48155;&#51088;.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h5&gt;model&#51032; &#44396;&#54788;&lt;/h5&gt;
&lt;p&gt;user model&#51008; restful authentication&#50640; &#51032;&#54644; &#51060;&#48120; &#49373;&#49457;&#46104;&#50612; &#51080;&#45796;. openid &#51064;&#51613;&#51012; &#51201;&#50857;&#54616;&#44592; &#50948;&#54644;&#49436;&#45716; &#50557;&#44036;&#51032; &#49688;&#51221;&#51060; &#54596;&#50836;&#54620;&#45936;, &#44536; &#45236;&#50857;&#51008; &#45796;&#51020;&#44284; &#44057;&#45796;.( &#48320;&#44221;&#46108; &#45236;&#50857;&#47564; &#51201;&#45716;&#45796;. )&lt;/p&gt;
&lt;ol class="code"&gt;
&lt;li&gt;&amp;nbsp; validates_presence_of&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; :email&lt;br /&gt;
&amp;nbsp; validates_presence_of&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; :login, :if =&amp;gt; :not_openid?&lt;/li&gt;
&lt;li&gt;&amp;nbsp; validates_length_of&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; :login,&amp;nbsp;&amp;nbsp;&amp;nbsp; :within =&amp;gt; 3..40, :if =&amp;gt; :not_openid?&lt;/li&gt;
&lt;li&gt;&amp;nbsp; validates_uniqueness_of&amp;nbsp;&amp;nbsp; :login, :email, :case_sensitive =&amp;gt; false, :allow_nil =&amp;gt; true&lt;/li&gt;
&lt;li&gt;&amp;nbsp;&lt;/li&gt;
&lt;li&gt;&amp;nbsp; attr_accessible :login, :email, :password, :password_confirmation, :identity_url &amp;nbsp;&lt;/li&gt;
&lt;li&gt;&amp;nbsp;&lt;/li&gt;
&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; def password_required?&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; not_openid? &amp;amp;&amp;amp; (crypted_password.blank? or not password.blank?)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; end&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; def not_openid?&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; identity_url.blank?&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; end&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&#51452;&#46108; &#45236;&#50857;&#51008; "openid&#47484; &#51060;&#50857;&#54616;&#45716; &#49324;&#50857;&#51088;&#50640;&#44172;&#45716; login, password&#44057;&#51060; &#54596;&#50836;&#50630;&#45716; &#44163;&#46308;&#50640; &#45824;&#54620; validation check&#51012; &#54616;&#45716; &#50506;&#45716;&#45796;." &#51060;&#45796;.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h5&gt;Controller &#51032; &#44396;&#54788;&lt;/h5&gt;
&lt;p&gt;sessions controller&#51032; &#45236;&#50857;&#51008; &#44900; &#44600;&#45796;.&lt;/p&gt;
&lt;ol class="code"&gt;
&lt;li&gt;class SessionsController &amp;lt; ApplicationController&lt;br /&gt;
&amp;nbsp; skip_before_filter :login_required&lt;br /&gt;
&amp;nbsp;&lt;br /&gt;
&amp;nbsp; def create&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; if using_open_id? params[:openid_identifier]&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; open_id_authentication params[:openid_identifier]&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; else&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; password_authentication(params[:login], params[:password])&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; end&lt;br /&gt;
&amp;nbsp; end&lt;br /&gt;
&amp;nbsp;&lt;br /&gt;
&amp;nbsp; def destroy&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; self.current_user.forget_me if logged_in?&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; cookies.delete :auth_token&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; reset_session&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; flash[:notice] = "&#47196;&#44536;&#50500;&#50883; &#46104;&#50632;&#49845;&#45768;&#45796;."&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; redirect_back_or_default('/')&lt;br /&gt;
&amp;nbsp; end&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; protected&lt;br /&gt;
&amp;nbsp; def password_authentication(login, password)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; self.current_user = User.authenticate(login, password)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; if logged_in?&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; successful_login&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; else&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; failed_login "Sorry, that username/password doesn't work"&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; end&lt;br /&gt;
&amp;nbsp; end&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; def open_id_authentication(openid_url)&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; authenticate_with_open_id(openid_url, :required=&amp;gt;[:nickname, :email],&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; :return_to=&amp;gt;openid_return_url) do |result, identity_url, registration|&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if result.successful?&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; @user = User.find_or_initialize_by_identity_url(identity_url)&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if @user.new_record?&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; @user.name = registration['nickname']&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; @user.email = registration['email']&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; @user.save #TODO : need to check validation&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; end&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; self.current_user = @user&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; successful_login&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; else&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; failed_login result.message&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; end&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; end&lt;br /&gt;
&amp;nbsp; end&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; private&amp;nbsp;&lt;br /&gt;
&amp;nbsp; def openid_return_url&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; "#{request.protocol + request.host_with_port + request.relative_url_root + request.path}" +&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; "?remember_me=#{params[:remember_me]}"&lt;br /&gt;
&amp;nbsp; end&lt;br /&gt;
&amp;nbsp;&lt;br /&gt;
&amp;nbsp; def successful_login&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; if params[:remember_me] == "1"&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; self.current_user.remember_me&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; cookies[:auth_token] = { :value =&amp;gt; self.current_user.remember_token , :expires =&amp;gt; self.current_user.remember_token_expires_at }&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; end&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; redirect_to(root_url)&lt;br /&gt;
&amp;nbsp; end&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; def failed_login(message)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; flash[:error] = message&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; redirect_to(new_session_url)&lt;br /&gt;
&amp;nbsp; end&lt;br /&gt;
end&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;openid_identifier&#44032; &#51080;&#45796;&#47732; &#51060; &#49324;&#50857;&#51088;&#45716; openid&#47484; &#51060;&#50857;&#54644;&#49436; &#47196;&#44536;&#51064;&#51012; &#54616;&#45716; &#44163;&#51060;&#45796;. &#47564;&#50557; &#44536;&#47111;&#51648; &#50506;&#45796;&#47732; &#51068;&#48152;&#51201;&#51064; login/password&#47196; &#47196;&#44536;&#51064;&#51012; &#54616;&#47140;&#45716; &#44163;&#51060;&#45796;.&amp;nbsp;login/password &#51064;&#51613;&#51060; &#54596;&#50836;&#50630;&#45796;&#47732; password_authentication &#47484; &#48764;&#46020; &#46108;&#45796;.&lt;/p&gt;
&lt;p&gt;&#47196;&#44536;&#50500;&#50883; &#44284;&#51221;&#51008; &#54217;&#48276;&#54616;&#45796;.&lt;/p&gt;
&lt;p&gt;open_id_authentication &#47484; &#49332;&#54196;&#48372;&#47732;,&lt;/p&gt;
&lt;p&gt;&#51064;&#51613;&#51012; &#54616;&#47732;&#49436; nickname&#44284; email&#51012; &#50836;&#52397;&#54620;&#45796;.&lt;/p&gt;
&lt;ol class="code"&gt;
&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; authenticate_with_open_id(openid_url, &lt;strong&gt;:required=&amp;gt;[:nickname, :email]&lt;/strong&gt;,&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; :return_to=&amp;gt;openid_return_url) do |result, identity_url, registration|&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&#47564;&#50557; &#52376;&#51020;&#51004;&#47196; &#47196;&#44536;&#51064;&#54616;&#45716; &#49324;&#50857;&#51088;&#46972;&#47732; user &#47484; &#54616;&#45208; &#49373;&#49457;&#54616;&#44256;&amp;nbsp;name&#44284; email&#51012; &#51200;&#51109;&#54620;&#45796;.&lt;/p&gt;
&lt;ol class="code"&gt;
&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; @user = User.find_or_initialize_by_identity_url(identity_url)&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if @user.new_record?&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; @user.name = registration['nickname']&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; @user.email = registration['email']&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; @user.save #TODO : need to check validation&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; end&amp;nbsp;&amp;nbsp;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&#51064;&#51613;&#51060; &#51096; &#46104;&#50632;&#45796;&#47732; current_user&#47484; user&#47196; &#54644; &#51452;&#51088;.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h6&gt;&#47196;&#44536;&#51064; &#44592;&#50613;&#54616;&#44592; &#44396;&#54788;&lt;/h6&gt;
&lt;p&gt;openid provider&#44032; &#51064;&#51613;&#51012; &#47560;&#52824;&#44256; &#51025;&#45813;&#51012; &#51460;&#46412;&#45716; :return_to &#51032; &#44050;&#51004;&#47196; &#51025;&#45813;&#54620;&#45796;.(&#44845; :return_to&#51032; &#44050;&#51008; &#50500;&#45768;&#45796;. &#50668;&#44592;&#50640; &#45796;&#47480; &#54028;&#46972;&#48120;&#53552;&#46308;&#46020; &#50668;&#47084;&#44060; &#48537;&#45716;&#45796;.) (&#51652;&#51060;&#44032; &#50724;&#45720; &#51060;&#49244;&#51667;&#51012; &#47566;&#51060;&#54616;&#45348;.. &#51060;&#51228; &#51221;&#47568; &#44256;&#50577;&#51060; &#49828;&#47101;&#45796;. &#45212; &#44536; &#44618;&#51008; &#49549;&#51012; &#50508; &#44600;&#51060; &#50630;&#44396;&#45208;.)&amp;nbsp;&#50668;&#44592;&#49436; return_to&#51032; &#44050;&#51004;&#47196; &#51221;&#51032;&#54620; openid_return_url&#51008; remember_me &#44032; parameter&#47196; &#54252;&#54632;&#46104;&#50612; &#51080;&#45796;. &#44536;&#47000;&#49436; "http://site.co.kr/sessions?remember_me=1" &amp;nbsp;&#44057;&#51008; &#47784;&#50577;&#51060;&#45796;. &#47564;&#50557; &#51025;&#45813; url&#51060; "/sessions &#51064; &#44163;&#51060; &#47560;&#51020;&#50640; &#46308;&#51648; &#50506;&#45716;&#45796;&#47732;&amp;nbsp;&#50896;&#54616;&#45716; &#44050;&#51004;&#47196; &#49688;&#51221;&#54624; &#49688;&#46020; &#51080;&#45796;. &#49688;&#51221; &#54980;&#50640;&#45716; routes.rb&#50640; &#44536; &#45236;&#50857;&#51012; &#50024;&#51452;&#45716; &#44163;&#51012; &#51082;&#51648; &#47568;&#51088;.&lt;/p&gt;
&lt;ol class="code"&gt;
&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; authenticate_with_open_id(openid_url, :required=&amp;gt;[:nickname, :email],&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;strong&gt;:return_to=&amp;gt;openid_return_url&lt;/strong&gt;) do |result, identity_url, registration|&lt;/li&gt;
&lt;li&gt;...&lt;/li&gt;
&lt;li&gt;&amp;nbsp; def openid_return_url&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; "#{request.protocol + request.host_with_port + request.relative_url_root + request.path}" +&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; "?remember_me=#{params[:remember_me]}"&lt;br /&gt;
&amp;nbsp; end&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;:return_to options&#51012; &#44403;&#51060; &#51201;&#50612;&#51452;&#45716; &#51060;&#50976;&#45716; remember_me &#51221;&#48372;&#47484; &#48372;&#51204;&#54616;&#44592; &#50948;&#54632;&#51060;&#45796;. &#51060; &#51221;&#48372;&#45716; &#51064;&#51613;&#51060; &#51096; &#51060;&#47336;&#50612;&#51652; &#54980; &#47196;&#44536;&#51064; &#51221;&#48372;&#47484; &#44592;&#50613;&#54624;&#51648;&#47484; &#44208;&#51221;&#54616;&#45716; &#45936; &#49324;&#50857;&#46108;&#45796;.&lt;/p&gt;
&lt;ol class="code"&gt;
&lt;li&gt;&amp;nbsp; def successful_login&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; if params[:remember_me] == "1"&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; self.current_user.remember_me&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; cookies[:auth_token] = { :value =&amp;gt; self.current_user.remember_token , :expires =&amp;gt; self.current_user.remember_token_expires_at }&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; end&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; redirect_to(root_url)&lt;br /&gt;
&amp;nbsp; end&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4&gt;&#50024;&#48372;&#45768;&lt;/h4&gt;
&lt;p&gt;&#50752;.. &#49373;&#44033;&#48372;&#45796; &#55016;&#50476; &#44036;&#45800;&#54616;&#45796;.&lt;/p&gt;
&lt;p&gt;&#45212; &#50500;&#51649; openid &#49828;&#54169;&#46020; &#51096; &#47784;&#47476;&#45716;&#45936;, &#51060; &#44592;&#45733;&#51012; &#44396;&#54788;&#54624; &#49688; &#51080;&#45796;&#45716; &#49324;&#49892;&#51060; &#45440;&#46989;&#44256;, &#46160;&#47157;&#45796;.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;(&#51652;&#51060;&#45716; &#52964;&#44032;&#47732;&#49436; &#50612;&#47532;&#44305;&#51060; &#45712;&#45716; &#44163; &#44057;&#45796;.)&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4&gt;&#52280;&#51312;&lt;/h4&gt;
&lt;p&gt;&lt;a href="http://www.bencurtis.com/archives/2007/03/rails-openid-and-acts-as-authenticated/" title="http://www.bencurtis.com/archives/2007/03/rails-openid-and-acts-as-authenticated/" class="external"&gt;acts as authentication plugin&#44284; openid &#47484; &#44057;&#51060; &#49324;&#50857;&#54616;&#44592;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://openid.springnote.com/pages/471141.xhtml" title="http://openid.springnote.com/pages/471141.xhtml" class="external"&gt;openid &#44428;&#51109;&#54364;&#51456; &#49828;&#53440;&#51068;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://openid.net/specs/openid-authentication-2_0.html" title="http://openid.net/specs/openid-authentication-2_0.html" class="external"&gt;openid 2.0 &#49828;&#54169;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://media.railscasts.com/videos/068_openid_authentication.mov" title="http://media.railscasts.com/videos/068_openid_authentication.mov" class="external"&gt;railscast&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://shinji.springnote.com/pages/475676" class="external" title="http://shinji.springnote.com/pages/475676"&gt;http://shinji.springnote.com/pages/475676&lt;/a&gt;&lt;/p&gt;
</source>
  <rights nil="true"></rights>
  <creator>http://aproxacs.myid.net/</creator>
  <contributor_modified>http://aproxacs.myid.net/</contributor_modified>
  <version type="integer">190</version>
  <tags></tags>
</page>
