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

Posted

技术标签:

【中文标题】使用 Authlogic 和 Authlogic OAuth 插件隐式创建用户【英文标题】:Implicit user creation with Authlogic and Authlogic OAuth plugin 【发布时间】:2010-11-13 21:13:15 【问题描述】:

我正在尝试在 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 的所有示例似乎都不关心只有一个登录按钮。:(

【问题讨论】:

【参考方案1】:

看来我要自己回答这个问题了。

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

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

然后,如果用户已经存在,我只需在 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

如果用户是首次访问者,则用户对象已成功保存在 LINE A 中。如果不是并且有可用的 oauth 令牌,则我们尝试从数据库中获取用户并记录他/她在。

【讨论】:

正是我想要的。谢谢

以上是关于使用 Authlogic 和 Authlogic OAuth 插件隐式创建用户的主要内容,如果未能解决你的问题,请参考以下文章

使用 OAuth 和 OpenID 的 Authlogic - DoubleRenderError

RAILS:Authlogic gem 和 Userstamp 插件

强制验证 Authlogic 中的空白密码

RESTful 身份验证还是 Authlogic?

让AuthLogic使用ActionCable

Ruby on Rails:没有 Authlogic 的 perishable_token?