Подтвердить что ты не робот

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

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

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

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

Проблема в том, что я не хочу иметь кнопки BOTH Register AND Login на моем сайте.

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

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

Любые подсказки о том, как это сделать?

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

4b9b3361

Ответ 1

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

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

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

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

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

Если пользователь является посетителем в первый раз, то пользовательский объект успешно сохраняется в LINE A. И если он отсутствует и есть доступный токен oauth, мы пытаемся извлечь пользователя из базы данных и записать его/ее в.