使用Ajax进行Omniauth授权调用

在使用它作为链接时,我的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
)

(我知道这个问题在这之前已经被问过了,但我还没有看到任何真正的答案。)


我知道这个问题有点老,但我仍然会回答。 面对这个问题,并期望实现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文档中发现任何关于ajax的信息,并且因为我在时间上运行,所以我实现了这个修复(因为谷歌搜索从未给我一个好的答案)。 Omniauth也可能支持ajax响应,但正如我所说的,我无法在文档中找到它。 答案是那些希望实现完全相同的功能,但不确定如何在Omniauth中实现它的用户。

我仍然在看Omniauth,以找到他们是否存在一种方法,直接在Omniauth中设置/调整配置

希望这个帮助


有两件事:首先,由于您使用的是本地主机,您必须设置端口号(假设为3000),因此端点应为localhost:3000 。 其次,你也必须设置一个重定向,它也应该是localhost:3000

链接地址: http://www.djcxy.com/p/65493.html

上一篇: Omniauth authorization call with Ajax

下一篇: How to add to end of list in prolog