<html><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; ">You'll need to install the 'openid' gem for this, and require it in your camping app:<div><br></div><div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 10px/normal Helvetica; font-size: 11px; "> <span style="color: #881350">class</span> Login < R <span style="color: #760f15">'/login'</span></div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 10px/normal Helvetica; font-size: 11px; "> <span style="color: #881350">def</span> get</div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 10px/normal Helvetica; font-size: 11px; "> this_url = <span style="color: #760f15">'http:'</span> + URL(<span style="color: #760f15">'/login'</span>).to_s</div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 10px/normal Helvetica; font-size: 11px; "> <span style="color: #881350">unless</span> input.finish.to_s == <span style="color: #760f15">'1'</span></div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 10px/normal Helvetica; color: rgb(35, 110, 37); font-size: 11px; "><span style="color: #000000"> </span># start doing the auth here</div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 10px/normal Helvetica; font-size: 11px; "> <span style="color: #881350">begin</span></div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 10px/normal Helvetica; font-size: 11px; "> oid_request = OpenID::Consumer.new(<span style="color: #c94b16">@state</span>, <span style="color: #0000cc">nil</span>).<span style="color: #881350">begin</span>(input.openid_identity)</div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 10px/normal Helvetica; font-size: 11px; "> oid_request.return_to_args[<span style="color: #760f15">'finish'</span>] = <span style="color: #760f15">'1'</span></div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 10px/normal Helvetica; font-size: 11px; "> redirect(oid_request.redirect_url(<span style="color: #760f15">'http:'</span> + URL(<span style="color: #760f15">'/'</span>).to_s, this_url))</div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 10px/normal Helvetica; font-size: 11px; "> <span style="color: #881350">rescue</span> OpenID::DiscoveryFailure</div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 10px/normal Helvetica; color: rgb(118, 15, 21); font-size: 11px; "><span style="color: #000000"> </span><span style="color: #881350">return</span><span style="color: #000000"> </span>'Couldn\'t find an OpenID at that address, are you sure it is one?'</div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 10px/normal Helvetica; font-size: 11px; "> <span style="color: #881350">end</span></div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 10px/normal Helvetica; font-size: 11px; "> <span style="color: #881350">else</span></div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 10px/normal Helvetica; color: rgb(35, 110, 37); font-size: 11px; "><span style="color: #000000"> </span># finish the auth here</div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 10px/normal Helvetica; font-size: 11px; "> response = OpenID::Consumer.new(<span style="color: #c94b16">@state</span>, <span style="color: #0000cc">nil</span>).complete(input, this_url)</div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 10px/normal Helvetica; font-size: 11px; "> <span style="color: #881350">case</span> response.status</div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 10px/normal Helvetica; font-size: 11px; "> <span style="color: #881350">when</span> OpenID::Consumer::SUCCESS</div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 10px/normal Helvetica; font-size: 11px; "> <span style="color: #c94b16">@state</span>.identity = response.identity_url.to_s</div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 10px/normal Helvetica; font-size: 11px; "> <span style="color: #881350">return</span> redirect(R(HomeScreen))</div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 10px/normal Helvetica; font-size: 11px; "> <span style="color: #881350">when</span> OpenID::Consumer::FAILURE</div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 10px/normal Helvetica; color: rgb(118, 15, 21); font-size: 11px; "><span style="color: #000000"> </span>'The OpenID thing doesn\'t think you really are that person, they said: '<span style="color: #000000"> + response.message</span></div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 10px/normal Helvetica; font-size: 11px; "> <span style="color: #881350">end</span></div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 10px/normal Helvetica; font-size: 11px; "> <span style="color: #881350">end</span></div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 10px/normal Helvetica; font-size: 11px; "> <span style="color: #881350">end</span></div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 10px/normal Helvetica; font-size: 11px; "> <span style="color: #881350">end</span></div></div><div><br></div><div>Then just point a form at /login with an input by the name of openid_identifier, and you have yourself some auth! It will set @state.identity to their OpenID URL. Using this you can auth people with existing aol, lifejournal, yahoo accounts, and a lot of littler openid provider's too. It could sure use some upgrades in the error reporting department, which you could hook up to your own error pages or whatever. I'll be using this in an app which doesn't use any relational databases, just file system storage. You'll probably want to change the 'return redirect(R(HomeScreen))' line near the end to some page in your app that logged in user's go to before you take this online too. :)</div><div><br></div><div>Public Domain.</div><div><br></div><div><br></div><div>–</div><div>Jenna</div></body></html>