Неявное создание пользователей с помощью плагинов Authlogic и Authlogic OAuth

Я пытаюсь написать простое потребительское приложение OAuth на Rails. Я использую Authlogic для обработки аутентификации и плагин Authlogic OAuth для выполнения функции oauth.

Плагин oauth предоставляет несколько помощников для отображения кнопки входа: oauth_login_button и oauth_register_button. Вместе с логикой Authlogic и фильтрами запросов плагина эти две кнопки каким-то образом создают сеанс / пользователя.

Далее происходит следующее: - если я использую помощник oauth_login_button, то объект сеанса не может быть сохранен, поскольку такого пользователя нет локально. - если я использую помощник oauth_register_button, то при любом входе в систему после первого Rails жалуется, что токен уже занят ... это означает, что он не может создать вторую копию для того же пользователя, что правильно.

Проблема в том, что я не хочу, чтобы на моем сайте были ОБЕ кнопки «Регистрация» и «Вход».

Что касается пользователя, то я хочу достичь единственной кнопки на стартовой странице, говорящей что-л. например, «Войти через Twitter», который пользователь должен щелкнуть, чтобы перейти на внутренние страницы сайта.

На стороне сервера я хочу неявно создать локальную учетную запись пользователя, если пользователь впервые посещает мой сайт.

Есть подсказки, как это сделать?

Все образцы Authlogic + OAuth, которые мне удалось найти, похоже, не заботятся о наличии только одной кнопки для входа. :(


person eploko    schedule 24.07.2009    source источник


Ответы (1)


Похоже, я сам отвечу на этот вопрос.

Я использую следующий код для создания кнопки входа (в HAML):

- form_tag({:controller => "users", :action => "create"}, {:method => "post"}) do
  = oauth_register_button :value => "Sign In with Twitter"

а затем я просто создаю объект сеанса пользователя в методе create класса UsersController, если пользователь уже существует:

def create
  @user = User.new(params[:user])
  @user.save do |result| # LINE A
    if result
      flash[:notice] = "Account registered!"
      redirect_to some_inner_path
    else
      unless @user.oauth_token.nil?
        @user = User.find_by_oauth_token(@user.oauth_token)
        unless @user.nil?
          UserSession.create(@user)
          flash.now[:message] = "Welcome back!"
          redirect_to some_inner_path        
        else
          redirect_back_or_default root_path
        end
      else
        redirect_back_or_default root_path
      end
    end
  end
end

Если пользователь является новым посетителем, то объект пользователя успешно сохраняется в СТРОКЕ A. А если это не так и есть доступный токен oauth, то мы пытаемся получить пользователя из БД и войти в систему.

person eploko    schedule 24.07.2009
comment
Именно то, что я искал. Спасибо - person Marc; 20.10.2009