无法设计无所不能的工作

时间:2012-06-16 17:07:19

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

我需要访问google API,我正在尝试让用户使用Devise 2.1.1和Omniauth使用他们的Google帐户登录(使用gem google_oauth2,因为OAuth2是来自Google文档的推荐)。

不幸的是,我无法让它工作,这是routes.rb

TestApp::Application.routes.draw do
  root :to => 'Landing#index'

  devise_for :users, :controllers => { :omniauth_callbacks => "users/omniauth_callbacks" }

  devise_scope :user do
    get 'sign_in', :to => 'users/sessions#new', :as => :new_session
    get 'sign_out', :to => 'users/sessions#destroy', :as => :destroy_session
  end
end

然后我将config/initializers/devise.rb配置为包含一行

  config.omniauth :google_oauth2, 'ID', 'SECRET', {access_type: 'offline', approval_prompt: 'force', scope: 'https://www.googleapis.com/auth/analytics.readonly'}

实际上我有一个无效的回调类app/controllers/users/omniauth_callbacks_controller.rb

class Users::OmniauthCallbacksController < Devise::OmniauthCallbacksController
end

当我点击“使用Google登录”时,我被重定向到谷歌,要求授权,然后我回到回调,然后我被重定向到网址http://localhost:3000/sign_in.user,错误

uninitialized constant Users::SessionsController

这里有什么问题?我花了两天的时间试图弄清楚它,我玩了很多配置,但从来没有让它工作,它开始让我感到沮丧。

这是rake routes

的输出
root     /                                      Landing#index
user_omniauth_authorize     /users/auth/:provider(.:format)        users/omniauth_callbacks#passthru {:provider=>/google_oauth2/}
user_omniauth_callback     /users/auth/:action/callback(.:format) users/omniauth_callbacks#(?-mix:google_oauth2)
new_session GET /sign_in(.:format)                     users/sessions#new
destroy_session GET /sign_out(.:format)                    users/sessions#destroy    

1 个答案:

答案 0 :(得分:1)

您似乎已被重定向到sign_in路线,该路线会根据users/sessions#new搜索routes.rb

但是,Users::SessionsController不存在会导致您描述的错误。

我不确定Devise / OmniAuth在哪些场景下会将您重定向到该特定路线,但我想您可以将其转到您的主页(人们可以再次点击Google OAuth登录按钮/链接)或将其直接连接到Google OAuth页面。 (这可能会让人们陷入无限循环,这取决于Devise / OmniAuth如何使用sign_in路线。)