8

Rails 3.1.4でOmniAuthを使用しており、すでに認証されているユーザーが複数のOpenIDプロバイダーを自分のアカウントに関連付けられるようにしようとしています。

認証されていないユーザーとして、OpenIDでのサインインは正常に機能します。認証されたユーザーとして、別のoidプロバイダーでサインインしようとすると、コールバックメソッドが実行されたときに、以前に認証されていなかったように見えます。

私には、セッションが初期化される前に(またはセッションが完全にスキップされる前に)コントローラーが実行されるように見えます。

どうなり得るか?

4

3 に答える 3

13

Andrei Serdeliucのソリューションを確認し、protect_from_forgeryを無効にするとうまくいきました(Ruby 1.8.7、Rails 2.3.11、OmniAuth 0.1.6)

あなたのCallbackController(有名なスクリーンキャストのAuthenticationsController)に追加する skip_before_filter :verify_authenticity_token protect_from_forgery :except => :create、コントローラーの上部に作業してください!

CSRF (クロスサイト リクエスト フォージェリ) の方法になる可能性があるため、openid サーバーの ID を確認する必要があります。(イニシャライザーで) 証明書の確認を設定することを忘れないでください。

# まず、ca-bundle.crt ファイルを取得します (例: オープンソースのブラウザー パッケージから)
「openid/fetchers」が必要
OpenID.fetcher.ca_file = "#{Rails.root}/config/ca-bundle.crt""

次のような警告を防ぎます。

警告: https://www.google.com/accounts/o8/id に https リクエストを送信
サーバー証明書を検証せずに; CA パスが指定されていません。

現在、私のセッションはもうリセットされておらず、複数の openid 認証を私の current_user に追加できます。

乾杯

于 2011-03-11T10:31:08.183 に答える
2

OmniAuthには「サインイン」の概念がないことに注意してください。ユーザーがサードパーティのアプリで認証されたことを確認し、独自のサインインシステムを実装する(または既存のシステムと統合する)ために必要な情報を提供するだけです。(このトピックには優れたスクリーンキャストがあります。たとえば、Railscastのパート1パート2を参照してください。)

そうは言っても、以下は、あなたがその一般的な罠に陥っておらず、コールバックのセッションデータへのアクセスに実際に問題があることを前提としています。私の側のいくつかの基本的なテストは、OmniAuthコールバックでセッションが期待どおりに機能することを示しています。https://github.com/BinaryMuse/so_5049994/compare/master...experimentで次のコードを参照してください:

class AuthController < ApplicationController
  def callback
    session[:count] ||= 0
    session[:count] += 1

    @count = session[:count]
    @env   = env['omniauth.auth']
  end
end

アプリケーションを持っているさまざまなサービス(FacebookやTwitterなど)を介して認証した後、次のような出力を受け取ります(ビューファイルを参照)。

OmniAuth Callback

Number of times viewed (session): 5

OmniAuth Hash:

  {"provider"=>"facebook", "uid"=>"1017... (rest of omniauth hash here)
于 2011-02-19T23:31:41.520 に答える