2

我正在使用 Rayan Bates http://railscasts.com/episodes/170-openid-with-authlogic资源作为基础。

所以我为 OpenID 提供商创建了几个图标,比如 Google、Yandex、OpenID,并且用户必须选择使用哪一个(类似于 stackoverflow 上的这里)。所以一切都很好。现在我决定只单击一次登录或注册:当用户单击图标时,Authlogic 必须创建新用户并对其进行身份验证,或者,如果用户存在,则对其进行身份验证。所以我绑定到 User#create 中的更改逻辑:

class UsersController < ApplicationController      
  def create
    @user = User.new(params[:user])
    @user.save do |result|
      if result
        redirect_to root_url
      else
        @user_session = UserSession.new(:openid_identifier => @user.openid_identifier)
        @user_session.save
        redirect_to root_url
      end
    end
  end
end

因此,如果无法保存用户,Authlogic 将尝试对他进行身份验证(当然,不仅存在具有相同 openid_identifier 的另一个用户,而且仅举例来说,用户不能被保存)。但这些方案是行不通的。什么都没发生,@user_session.save在这种情况下什么也不返回。

更新

调查Shripad K链接源(http://github.com/shripadk/authlogic_openid_selector_example/blob/master/app/models/user_session.rb)我发现了这个:

class UserSession < Authlogic::Session::Base
  auto_register
end

auto_register我所需要的

4

2 回答 2

1

您可以尝试一下,而不是重新发明轮子:http: //github.com/shripadk/authlogic_openid_selector_example

实时示例应用程序: http: //testingauth.heroku.com/

于 2010-07-18T05:52:51.250 回答
0

嗯。由于我无法将 POST 重定向到 user_sessions 创建操作,所以我做了这样的破解:

class UsersController < ApplicationController
  def new
    @user = User.new
  end

  def create
    @user = User.new(params[:user])
    @user.save do |result|
      if result
        redirect_to root_url
      else
        if User.find_by_openid_identifier(@user.openid_identifier)
          redirect_to :action => 'login', "user_session[openid_identifier]" => @user.openid_identifier
        else
          render :action => "new"
        end
      end
    end
  end

  def login
    @user_session = UserSession.new(params[:user_session])
    @user_session.save do |result|
      if result
        redirect_to root_url
      else
        render :action => 'new'
      end
    end    
  end
end
于 2010-07-17T20:04:07.147 回答