Wrap text
Report abuse
|
|
require 'openid'
require 'openid/store/filesystem'
require 'openid/extensions/sreg'
require 'timeout'
class LoginsController < ApplicationController
def show
redirect_to new_login_url unless logged_in?
end
def new
redirect_to login_url if logged_in?
end
def create
Timeout.timeout(10) do
res = openid_consumer.begin(params[:openid_url])
#Only request additional data if new user
unless User.find_by_openid_url(res.endpoint.claimed_id)
sreg = OpenID::SReg::Request.new
sreg.request_fields(['nickname', 'fullname', 'email'], false)
res.add_extension(sreg)
end
redirect_to res.redirect_url(root_url, complete_login_url)
end
rescue OpenID::OpenIDError, Timeout::Error => e
flash.now[:error] = 'Could not contact OpenID URL'
render :action => 'new'
end
def complete
res = openid_consumer.complete(params.reject{|k,v| request.path_parameters.include?(k) }, request.url)
case res.status
when OpenID::Consumer::SUCCESS
self.current_user = User.find_by_openid_url(res.identity_url)
if logged_in?
flash[:notice] = 'Logged in'
redirect_to user_posts_url(current_user)
else
sreg = OpenID::SReg::Response.from_success_response(res).data
sreg_data = {:username => sreg['nickname'], :name => sreg['fullname'], :email => sreg['email']}
user = User.new(sreg_data)
user.openid_url = res.identity_url
if user.save
self.current_user = user
redirect_to user_posts_url(user)
else
flash[:sreg_data] = {:username => sreg['nickname'], :name => sreg['fullname'], :email => sreg['email'], :openid_url => res.identity_url}
redirect_to new_user_url
end
end
return
when OpenID::Consumer::CANCEL
flash[:error] = 'Authentication was canceled'
when OpenID::Consumer::FAILURE
flash[:error] = "FAIL: #{res.message}"
when OpendID::Consumer::SETUP_NEEDED
flash[:error] = 'Setup needed'
else
flash[:error] = 'Unknown response'
end
redirect_to login_url
end
def destroy
self.current_user = nil
redirect_to :back
end
private
def openid_consumer
@openid_consumer ||= OpenID::Consumer.new(session,
OpenID::Store::Filesystem.new(File.join(RAILS_ROOT, 'tmp', 'openid')))
end
end
|