Authlogic и OpenID регистрация и вход в одно действие
Я играл с Райаном Бейтсом http://railscasts.com/episodes/170-openid-with-authlogic источниками в качестве основы.
Поэтому я создал несколько иконок для провайдеров OpenID, таких как Google, Yandex, OpenID, и пользователь должен выбрать, какой из них использовать (аналогично, как здесь, в stackru). Так что все в порядке. Теперь я решаю сделать только один клик для входа или регистрации: когда пользователь нажимает на иконку Authlogic, необходимо создать нового пользователя и аутентифицировать его, или, если пользователь существует, просто аутентифицировать его. Поэтому я привязал изменить логику в User#create:
class UsersController < ApplicationController
def create
@user = User.new(params[:user])
@user.save do |result|
if result
redirect_to root_url
else
@user_session = UserSession.new(:openid_identifier => @user.openid_identifier)
@user_session.save
redirect_to root_url
end
end
end
end
Таким образом, если пользователь не может быть сохранен, Authlogic попытается аутентифицировать его (конечно, пользователь не может быть сохранен не только, если существует другой пользователь с таким же openid_identifier, но только для примера). Но эти схемы не работают. Ничего не случилось, @user_session.save
ничего не вернуть в этом случае.
Upd
Рассматривая источники ссылок Shripad K ( http://github.com/shripadk/authlogic_openid_selector_example/blob/master/app/models/user_session.rb), я уловил это:
class UserSession < Authlogic::Session::Base
auto_register
end
auto_register
все что мне нужно
2 ответа
Вместо того, чтобы изобретать велосипед, вы можете попробовать это: http://github.com/shripadk/authlogic_openid_selector_example
Пример приложения в реальном времени: http://testingauth.heroku.com/
Эмм. Поскольку я не могу перенаправить POST в user_sessions create action, я сделал хак следующим образом:
class UsersController < ApplicationController
def new
@user = User.new
end
def create
@user = User.new(params[:user])
@user.save do |result|
if result
redirect_to root_url
else
if User.find_by_openid_identifier(@user.openid_identifier)
redirect_to :action => 'login', "user_session[openid_identifier]" => @user.openid_identifier
else
render :action => "new"
end
end
end
end
def login
@user_session = UserSession.new(params[:user_session])
@user_session.save do |result|
if result
redirect_to root_url
else
render :action => 'new'
end
end
end
end