使用Authlogic和Authlogic OAuth插件创建隐式用户

epl*_*oko 17 ruby ruby-on-rails oauth authlogic

我正在尝试在Rails中编写一个简单的OAuth消费者应用程序.我正在使用Authlogic来处理身份验证,使用Authlogic OAuth插件来执行oauth操作.

oauth插件提供了几个帮助来呈现登录按钮:oauth_login_button和oauth_register_button.与Authlogic逻辑和插件的请求过滤器一起,这两个按钮以某种方式创建会话/用户.

接下来发生的事情如下: - 如果我使用oauth_login_button助手,那么会话对象无法保存,因为本地没有这样的用户. - 如果我使用oauth_register_button助手,那么,在第一个之后的任何登录中,Rails会抱怨已经取得了令牌......这意味着它无法为同一个用户创建第二个副本,这是正确的.

问题是:我不想在我的网站上有两个注册和登录按钮.

在用户方面,我想要实现的是起始页面上的一个按钮,说smth.例如"使用Twitter登录",用户必须单击该页面以进入网站的内部页面.

在服务器端,如果用户是我网站的第一次访问者,我想隐式创建本地用户帐户.

关于如何做到这一点的任何提示?

Authlogic + OAuth上的所有样本我都能找到,似乎并不关心只有一个按钮可以登录.:(

epl*_*oko 12

好像我将自己回答这个问题.

我使用以下代码生成登录按钮(在HAML中):

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

然后我只是在UsersController类的create方法中创建用户的会话对象,如果用户已经存在:

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
Run Code Online (Sandbox Code Playgroud)

如果用户是第一次访问者,则用户对象成功保存在LINE A中.如果不是,并且有可用的oauth令牌,那么我们尝试从DB中获取用户并将他/她登录.