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 文档中找到任何关于 ajax 的信息,因为我在争分夺秒,因此我实施了这个修复(因为谷歌搜索从来没有给我一个有利的答案)。Omniauth 也有可能支持 ajax 响应,但正如我所说,我在文档中找不到。答案是那些希望实现完全相同的功能但不确定如何在 Omniauth 中实现它的用户。

我仍在查看 Omniauth 以查找他们是否存在通过设置/调整配置直接在 Omniauth 中执行此操作的方法

希望这有帮助

于 2014-04-15T10:04:15.317 回答
0

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

于 2014-01-22T09:07:48.477 回答