【问题标题】:Rails route namespaced in omniauth以omniauth命名的Rails路由
【发布时间】:2013-04-02 05:07:08
【问题描述】:

我在 routes.rb 中有这个:

namespace :api do
  namespace :v1 do
    ...
    devise_for :users, constraints: { format: :json },
      :controllers => { :omniauth_callbacks => "auths" }
    ...
  end
end

其中包括以下路线:

new_api_v1_user_confirmation GET        /api/v1/users/confirmation/new(.:format)          api/v1/confirmations#new {:format=>:json}
                             GET        /api/v1/users/confirmation(.:format)              api/v1/confirmations#show {:format=>:json}
api_v1_user_omniauth_authorize            /users/auth/:provider(.:format)                   auths#passthru {:provider=>/facebook|twitter|linkedin/, :format=>:json}
api_v1_user_omniauth_callback            /users/auth/:action/callback(.:format)            auths#(?-mix:facebook|twitter|linkedin) {:format=>:json}

如何将最后两条路由命名为命名空间,例如:

/api/v1/auth/:provider(.:format)
/api/v1/auth/:provider/callback(.:format)

【问题讨论】:

  • 有没有想过这个问题?我也有同样的问题。
  • 我最终从我的 API 消费者应用程序指向没有 api 命名空间的 ip_of_api_server/users/auth
  • FWIW,我只是决定在没有设计的情况下使用omniauth,并将其放在我适当的命名空间中,然后手动进行身份验证后的工作。但是我们也在做骨干/木偶,devise也不喜欢和它玩得很好。
  • 不错,具体怎么样?
  • 将 cmets 转换为答案

标签: ruby-on-rails-3 devise routes omniauth


【解决方案1】:

我想我应该将我的 cmets 转换为答案:

对于我们的应用程序,我们正在做纯 json api 的事情,带有骨干/牵线木偶。为了让 oAuth 与设计一起工作 - 我从设计中删除了它。 :) 删除了我设置的omniauthable 属性,并从我的初始化程序/devise.rb 中删除了omniauth 设置。然后在omniauth页面上阅读我自己实现了它。

我的 api 位于“/api/v1”下

  1. 创建了 initializers/omniauth.rb 文件,列出了我的提供程序和密钥。对于每个提供者,我还给了它一个 :path_prefix=>"/api/v1/auth" 属性。
  2. 在我的名为 api/v1/oauth_controller.rb 的 api 中创建一个回调控制器,它使用模块正确命名,并包含我的服务回调路径。
  3. 更新了我的路由以设置omni 的回调路由。见这里:gist.github.com/DaveSanders/5835642
  4. 在 OAuthController.create 中,我使用了提供者的详细信息,并完成了“社交网络用户是否存在并拥有映射帐户?”的基本流程。如果是这样,请通过设计的 user.sign_in 登录?如果没有,请创建用户然后登录。
  5. 重定向回我的应用程序,然后再次启动主干网,然后可以获取登录的用户详细信息并根据需要使用它们。

您的实现可能会有所不同,但我处理我的 oAuth 帐户的方式是将它们放在自己的表中(Twitter、Facebook 等),然后将它们链接到我的设计用户。这样我就可以关联多个帐户,并且用户可以使用其中任何一个帐户登录。

另外,请务必将您的 twitter/facebook 回调设置为:

http://127.0.0.1:3000/api/v1/auth/twitter/callback

在开发中匹配您的路线。

希望这对其他人有所帮助。如果我忘记了一个步骤或者你迷路了,请询问。

【讨论】:

  • 它对我不起作用。以下是提供者列表:# config/initializers/omniauth.rb Rails.application.config.middleware.use OmniAuth::Builder do provider :facebook, ENV['FACEBOOK_KEY'], ENV['FACEBOOK_SECRET'], :path_prefix=>"/api/v1/auth" end,这是来自 rake routes => ` GET /api/v1/auth/:provider/callback(.:format) devise_token_auth/omniauth_callbacks#omniauth_success GET /api/v1/auth 的路线/:provider(.:format) 重定向(301)`
  • 仍然收到此错误=> 没有路由匹配 [POST] "/api/v1/auth/facebook"
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多