Authlogic и OpenID регистрация и вход в одно действие - PullRequest
2 голосов
/ 17 июля 2010

Я играл с Райаном Бейтсом http://railscasts.com/episodes/170-openid-with-authlogic источниками в качестве основы.

Поэтому я создал несколько значков для провайдеров OpenID, таких как Google, Yandex, OpenID, и пользователь должен выбрать, какой из них использовать (аналогично тому, как здесь в stackoverflow). Так что все в порядке. Теперь я решаю сделать только один клик для входа или регистрации: когда пользователь нажимает на иконку 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 ]

1 голос
/ 18 июля 2010

Вместо того, чтобы изобретать велосипед, вы можете попробовать: http://github.com/shripadk/authlogic_openid_selector_example

Пример приложения в реальном времени: http://testingauth.heroku.com/

0 голосов
/ 18 июля 2010

Эммы.Поскольку я не могу перенаправить POST в действие user_sessions create, я сделал хак следующим образом:

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
...