2009-07-24 42 views
17

我想在Rails中编写一个简单的OAuth使用者应用程序。我使用Authlogic处理身份验证,使用Authlogic OAuth插件执行oauth操作。使用Authlogic和Authlogic OAuth插件创建隐式用户

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

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

问题是:我不希望在我的网站上都有注册和登录按钮。

在用户方面,我想要实现的是开始页面上的一个按钮,说smth。如“使用Twitter登录”,用户必须点击该按钮才能进入网站的内部页面。

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

任何提示如何做到这一点?

所有的Authlogic + OAuth的样品我能找到似乎并不关心其在只为标志的一个按钮。:(

回答

11

好像我要回答这个问题我自己。

我使用下面的代码来生成登录按钮(在HAML):

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

然后我简单地创建在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 

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

+0

正是我刚才找的。谢谢 – 2009-10-19 22:06:30