17

Rails で単純な OAuth コンシューマー アプリを作成しようとしています。認証の処理には Authlogic を使用し、oauth の処理には Authlogic OAuth プラグインを使用しています。

oauth プラグインは、サインイン ボタンをレンダリングするためのいくつかのヘルパーを提供します: oauth_login_button と oauth_register_button。Authlogic ロジックとプラグインのリクエスト フィルタを組み合わせて、これら 2 つのボタンが何らかの方法でセッション/ユーザーを作成します。

次に起こることは次のとおりです: - oauth_login_button ヘルパーを使用すると、そのようなユーザーがローカルに存在しないため、セッション オブジェクトの保存に失敗します。- oauth_register_button ヘルパーを使用すると、最初のログイン後のログイン時に、Rails はトークンが既に取得されていると不平を言います...つまり、同じユーザーに対して 2 番目のコピーを作成できないということです。これは正しいことです。

問題は、自分のサイトに登録ボタンとログイン ボタンの両方を配置したくないということです。

ユーザー側で実現したいのは、スタート ページに smth と表示される 1 つのボタンです。「Twitter でサインイン」のように、ユーザーはサイトの内部ページに進むためにクリックする必要があります。

サーバー側では、ユーザーが初めてサイトにアクセスした場合に、暗黙的にローカル ユーザー アカウントを作成したいと考えています。

これを行う方法に関するヒントはありますか?

私が見つけた Authlogic+OAuth のすべてのサンプルは、サインイン用のボタンが 1 つしかないことを気にしていないようです。:(

4

1 に答える 1

12

自分で質問に答えようとしているようです。

次のコードを使用して、[サインイン] ボタンを (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 トークンがある場合は、DB からユーザーを取得してログインしようとします。

于 2009-07-24T23:35:40.190 に答える