7

リンクとして使用すると、Rails 3 アプリで omniauth が正常に動作します。

link_to("Connect Twitter", "/auth/twitter", :id => "connect-to-twitter")

ここで、ajax を介して「/auth/twitter」を呼び出したいと思います。ただし、リクエスト フェーズの後は何も返されません。最後のログ エントリは次のとおりです。

Started GET "/auth/twitter" for 127.0.0.1 at 2012-10-30 17:53:02 -0700
(twitter) Request phase initiated.

これが私のajaxコードです(Coffeescriptで):

$("#connect-to-twitter").live("click", ->
  alert('get twitter')
  $.get('/auth/twitter', (data) ->
    alert(data)
  )
  return false
)

(この質問は以前ここで尋ねられたことは知っていますが、それに対する本当の答えは見たことがありません。)

4

2 に答える 2

4

質問が少し古いことは知っていますが、それでも答えます。問題に直面し、OPが意図したものと同じことを達成しようとした後、私はこれを行いました

Omniauthミドルウェアを作成し、ミドルウェアがどのように見えるかのすぐ上に挿入しました

class OmniAuthMiddleware
  def initialize(app)
    @app = app
  end

  def call(env)
    status, headers, body = @app.call(env)
    request = Rack::Request.new(env)
    if request.xhr? and status == 302 and request.path_info =~ /\/auth\/\w+\z/ and body.class == Rack::BodyProxy
      location = headers["Location"]
      body = ActionDispatch::Response.new
      headers = {'Content-Type'=>'text/javascript; charset=utf-8'}
      body.body = ["window.location.href='#{location}'"]
      body.headers = headers
      status = 200
    end
    [status,headers,body]
  end
end

そして、ここでミドルウェアスタックにミドルウェアごとに挿入する方法

Rails.application.config.middleware.insert_before OmniAuth::Builder,OmniAuthMiddleware

ここに私のミドルウェアスタックがどのように見えるか

...
...
...
use Warden::Manager
use Rack::Mongoid::Middleware::IdentityMap
use ExceptionNotifier
use OmniAuthMiddleware
use OmniAuth::Builder
run PoasterApi::Application.routes

これで、私が望んでいたことを達成することができました

: Omniauth doc で ajax に関する情報が見つかりませんでした。また、時間に追われて実行していたため、この修正を実装しました (Google 検索で適切な回答が得られなかったため)。Omniauth も ajax レスポンスをサポートしている可能性がありますが、前述のとおり、ドキュメントで見つけることができませんでした。答えは、まったく同じ機能を実装したいが、 Omniauth でそれを実現する方法がわからないユーザー向けです。

私はまだOmniauthを調べて、構成を設定/調整することでOmniauthで直接これを行う方法が存在するかどうかを確認しています

この助けを願っています

于 2014-04-15T10:04:15.317 に答える
0

2 つのこと: まず、localhost を使用しているため、ポート番号 (3000 を想定) を設定する必要があるため、エンドポイントはlocalhost:3000にする必要があります。次に、リダイレクトも設定する必要があります。これもlocalhost:3000にする必要があります。

于 2014-01-22T09:07:48.477 に答える