2017-05-03 2 views
0

Je n'arrive pas à faire fonctionner OmniAuth. J'ai suivi ce tutoriel here pour essayer de l'implémenter avec mon application existante, mais j'arrive avec l'erreur ActionController::RoutingError at /users/auth/github/upgrade uninitialized constant OmniauthCallbacksController. J'ai regardé plusieurs autres postes de SO, mais la plupart de ces réponses traitent des fautes d'orthographe et j'ai vérifié trois fois que tout est orthographié correctement. Qu'est-ce qui pourrait interférer?Constante non initialisée OmniauthCallbacksController lors de la tentative d'inscription de l'utilisateur

Modèle utilisateur:

class User < ActiveRecord::Base 
    devise :database_authenticatable, :registerable, 
       :recoverable, :rememberable, :trackable, :omniauthable 

    has_many :identities 

    def github 
     identities.where(:provider => "github").first 
    end 

    def github_client 
     @github_client ||= Github.client(access_token: github.accesstoken) 
    end 

    def linkedin 
     identities.where(:provider => "linkedin").first 
    end 

    def linkedin_client 
     @linkedin_client ||= Linkedin.client(access_token: linkedin.accesstoken) 
    end 
end 

Identité Modèle:

Modèle Devise:

Devise.setup do |config| 

    # config.omniauth :google_oauth2, ENV['GOOGLE_OAUTH2_APP_ID'], ENV['GOOGLE_OAUTH2_APP_SECRET'], scope: "email,profile,offline", prompt: "consent" 
    config.omniauth :github, ENV['GITHUB_APP_ID'], ENV['GITHUB_APP_SECRET'], setup: true 
    # config.omniauth :facebook, ENV['FACEBOOK_APP_ID'], ENV['FACEBOOK_APP_SECRET'], scope: "email" 
    config.omniauth :linkedin, ENV['LINKEDIN_APP_ID'], ENV['LINKEDIN_APP_SECRET'], setup: true 

Omniauth Modèle:

Rails.application.config.middleware.use OmniAuth::Builder do 

    provider :github, ENV['GITHUB_KEY'], ENV['GITHUB_SECRET'] 
    provider :linkedin, ENV['LINKEDIN_KEY'], ENV['LINKEDIN_SECRET'] 
end 

FormUser Modèle

class FormUser < User 
    attr_accessor :current_password 

    validates_presence_of :email, if: :email_required? 
    validates_uniqueness_of :email, allow_blank: true, if: :email_changed? 
    validates_format_of  :email, with: Devise.email_regexp, allow_blank: true, if: :email_changed? 

    validates_presence_of  :password, if: :password_required? 
    validates_confirmation_of :password, if: :password_required? 
    validates_length_of  :password, within: Devise.password_length, allow_blank: true 

    def password_required? 
    return false if email.blank? 
    !persisted? || !password.nil? || !password_confirmation.nil? 
    end 

    def email_required? 
    true 
    end 
end 

Omniauth Callbacks Controller:

class Users::OmniauthCallbacksController < Devise::OmniauthCallbacksController 
    def instagram 
    generic_callback('instagram') 
    end 

    def facebook 
    generic_callback('facebook') 
    end 

    def twitter 
    generic_callback('twitter') 
    end 

    def google_oauth2 
    generic_callback('google_oauth2') 
    end 

    def generic_callback(provider) 
    @identity = Identity.find_for_oauth env["omniauth.auth"] 

    # @user = @identity.user || current_user 
    @user = @identity.user || User.find_by(email: @identity.email) || current_user 
    if @user.nil? 
     @user = User.create(email: @identity.email || "") 
     @identity.update_attribute(:user_id, @user.id) 
    end 

    if @user.email.blank? && @identity.email 
     @user.update_attribute(:email, @identity.email) 
    end 

    if @user.persisted? 
     @identity.update_attribute(:user_id, @user.id) 
     # This is because we've created the user manually, and Device expects a 
     # FormUser class (with the validations) 
     @user = FormUser.find @user.id 
     sign_in_and_redirect @user, event: :authentication 
     set_flash_message(:notice, :success, kind: provider.capitalize) if is_navigational_format? 
    else 
     session["devise.#{provider}_data"] = env["omniauth.auth"] 
     redirect_to new_user_registration_url 
    end 
    end 

    def upgrade 
    scope = nil 
    if params[:provider] == "google_oauth2" 
     scope = "email,profile,offline,https://www.googleapis.com/auth/admin.directory.user" 
    end 

    redirect_to user_omniauth_authorize_path(params[:provider]), flash: { scope: scope } 
    end 

    def setup 
    request.env['omniauth.strategy'].options['scope'] = flash[:scope] || request.env['omniauth.strategy'].options['scope'] 
    render :text => "Setup complete.", :status => 404 
    end 
end 

Inscriptions Contrôleur:

class Users::RegistrationsController < Devise::RegistrationsController 
    def create 

    unless params["user"]["code"] == ENV["CODE_TO_SIGN_UP"] 
     respond_to do |format| 
     format.html { return redirect_to new_user_registration_path, notice: 'The code you entered was wrong. Please contact ' + ENV["ADMIN_EMAIL"] } 
     end 
    end 

    super 
    end 

    def update_resource(resource, params) 
    if resource.encrypted_password.blank? # || params[:password].blank? 
     resource.email = params[:email] if params[:email] 
     if !params[:password].blank? && params[:password] == params[:password_confirmation] 
     logger.info "Updating password" 
     resource.password = params[:password] 
     resource.save 
     end 
     if resource.valid? 
     resource.update_without_password(params) 
     end 
    else 
     resource.update_with_password(params) 
    end 
    end 

Routes

Rails.application.routes.draw do 
devise_for :users, class_name: 'FormUser', :controllers => { 
    omniauth_callbacks: 'users/omniauth_callbacks', 
    registrations: 'users/registrations' 
    } 

    devise_scope :user do 
    get '/users/auth/:provider/upgrade' => 'omniauth_callbacks#upgrade', as: :user_omniauth_upgrade 
    get '/users/auth/:provider/setup', :to => 'omniauth_callbacks#setup' 
    end 

end 

MISE À JOUR routes râteau:

Prefix Verb  URI Pattern        Controller#Action 
       new_user_session GET  /users/sign_in(.:format)    devise/sessions#new 
        user_session POST  /users/sign_in(.:format)    devise/sessions#create 
      destroy_user_session DELETE /users/sign_out(.:format)    devise/sessions#destroy 
    user_github_omniauth_authorize GET|POST /users/auth/github(.:format)   users/omniauth_callbacks#passthru 
    user_github_omniauth_callback GET|POST /users/auth/github/callback(.:format) users/omniauth_callbacks#github 
user_linkedin_omniauth_authorize GET|POST /users/auth/linkedin(.:format)   users/omniauth_callbacks#passthru 
user_linkedin_omniauth_callback GET|POST /users/auth/linkedin/callback(.:format) users/omniauth_callbacks#linkedin 
        user_password POST  /users/password(.:format)    devise/passwords#create 
       new_user_password GET  /users/password/new(.:format)   devise/passwords#new 
       edit_user_password GET  /users/password/edit(.:format)   devise/passwords#edit 
           PATCH /users/password(.:format)    devise/passwords#update 
           PUT  /users/password(.:format)    devise/passwords#update 
     cancel_user_registration GET  /users/cancel(.:format)     users/registrations#cancel 
       user_registration POST  /users(.:format)      users/registrations#create 
      new_user_registration GET  /users/sign_up(.:format)    users/registrations#new 
      edit_user_registration GET  /users/edit(.:format)     users/registrations#edit 
           PATCH /users(.:format)      users/registrations#update 
           PUT  /users(.:format)      users/registrations#update 
           DELETE /users(.:format)      users/registrations#destroy 
      user_omniauth_upgrade GET  /users/auth/:provider/upgrade(.:format) users/omniauth_callbacks#upgrade 
           GET  /users/auth/:provider/setup(.:format) users/omniauth_callbacks#setup 
        typing_tests GET  /typing_tests(.:format)     typing_tests#index 
           POST  /typing_tests(.:format)     typing_tests#create 
       new_typing_test GET  /typing_tests/new(.:format)    typing_tests#new 
       edit_typing_test GET  /typing_tests/:id/edit(.:format)  typing_tests#edit 
        typing_test GET  /typing_tests/:id(.:format)    typing_tests#show 
           PATCH /typing_tests/:id(.:format)    typing_tests#update 
           PUT  /typing_tests/:id(.:format)    typing_tests#update 
           DELETE /typing_tests/:id(.:format)    typing_tests#destroy 
         prompts GET  /prompts(.:format)      prompts#index 
           POST  /prompts(.:format)      prompts#create 
         new_prompt GET  /prompts/new(.:format)     prompts#new 
        edit_prompt GET  /prompts/:id/edit(.:format)    prompts#edit 
          prompt GET  /prompts/:id(.:format)     prompts#show 
           PATCH /prompts/:id(.:format)     prompts#update 
           PUT  /prompts/:id(.:format)     prompts#update 
           DELETE /prompts/:id(.:format)     prompts#destroy 
        universities GET  /universities(.:format)     universities#index 
           POST  /universities(.:format)     universities#create 
        new_university GET  /universities/new(.:format)    universities#new 
       edit_university GET  /universities/:id/edit(.:format)  universities#edit 
         university PATCH /universities/:id(.:format)    universities#update 
           PUT  /universities/:id(.:format)    universities#update 
           DELETE /universities/:id(.:format)    universities#destroy 
         programs GET  /programs(.:format)      programs#index 
           POST  /programs(.:format)      programs#create 
        new_program GET  /programs/new(.:format)     programs#new 
        edit_program GET  /programs/:id/edit(.:format)   programs#edit 
         program PATCH /programs/:id(.:format)     programs#update 
           PUT  /programs/:id(.:format)     programs#update 
           DELETE /programs/:id(.:format)     programs#destroy 
          users GET  /users(.:format)      users#index 
         edit_user GET  /users/:id/edit(.:format)    users#edit 
          user GET  /users/:id(.:format)     users#show 
           PATCH /users/:id(.:format)     users#update 
           PUT  /users/:id(.:format)     users#update 
           DELETE /users/:id(.:format)     users#destroy 
          root GET /          typing_tests#index 
      unauthenticated_root GET /          devise/sessions#new 

trace de la pile:

Started GET "/" for 127.0.0.1 at 2017-05-03 18:24:26 -0500 
    ActiveRecord::SessionStore::Session Load (0.5ms) SELECT "sessions".* FROM "sessions" WHERE "sessions"."session_id" = '430aa65b41ec7892dd1581f14a9fbd16' ORDER BY "sessions"."id" ASC LIMIT 1 
Processing by Devise::SessionsController#new as HTML 
    Rendered devise/shared/_links.html.erb (0.3ms) 
    Rendered devise/sessions/new.html.erb within layouts/application (4.5ms) 
Completed 200 OK in 90ms (Views: 88.9ms | ActiveRecord: 0.0ms) 
    (0.1ms) BEGIN 
    SQL (0.3ms) UPDATE "sessions" SET "data" = $1, "updated_at" = $2 WHERE "sessions"."id" = 45 [["data", "BAh7BkkiEF9jc3JmX3Rva2VuBjoGRUZJIjFjakIxRFIwRzIxaEl6SkZoNEsv\nMVdGeHZUSGNUS0R0d3cxWFB3aENBbWVjPQY7AEY=\n"], ["updated_at", "2017-05-03 23:24:26.682877"]] 
    (6.5ms) COMMIT 


Started GET "https://stackoverflow.com/users/auth/github/upgrade" for 127.0.0.1 at 2017-05-03 18:24:27 -0500 
Processing by Users::OmniauthCallbacksController#upgrade as HTML 
    Parameters: {"provider"=>"github"} 
Completed 500 Internal Server Error in 19ms 

NoMethodError - undefined method `user_omniauth_authorize_path' for #<Users::OmniauthCallbacksController:0x007f9a1e0012b0> 
Did you mean? user_omniauth_upgrade_path 
       user_github_omniauth_authorize_path: 
    app/controllers/users/omniauth_callbacks_controller.rb:51:in `upgrade' 
    actionpack (4.1.9) lib/action_controller/metal/implicit_render.rb:4:in `send_action' 
    actionpack (4.1.9) lib/abstract_controller/base.rb:189:in `process_action' 
    actionpack (4.1.9) lib/action_controller/metal/rendering.rb:10:in `process_action' 
    actionpack (4.1.9) lib/abstract_controller/callbacks.rb:20:in `block in process_action' 
    activesupport (4.1.9) lib/active_support/callbacks.rb:113:in `call' 
    activesupport (4.1.9) lib/active_support/callbacks.rb:149:in `block in halting_and_conditional' 
    activesupport (4.1.9) lib/active_support/callbacks.rb:229:in `block in halting' 
    activesupport (4.1.9) lib/active_support/callbacks.rb:166:in `block in halting' 
    activesupport (4.1.9) lib/active_support/callbacks.rb:166:in `block in halting' 
    activesupport (4.1.9) lib/active_support/callbacks.rb:166:in `block in halting' 
    activesupport (4.1.9) lib/active_support/callbacks.rb:86:in `run_callbacks' 
    actionpack (4.1.9) lib/abstract_controller/callbacks.rb:19:in `process_action' 
    actionpack (4.1.9) lib/action_controller/metal/rescue.rb:29:in `process_action' 
    actionpack (4.1.9) lib/action_controller/metal/instrumentation.rb:31:in `block in process_action' 
    activesupport (4.1.9) lib/active_support/notifications.rb:159:in `block in instrument' 
    activesupport (4.1.9) lib/active_support/notifications/instrumenter.rb:20:in `instrument' 
    activesupport (4.1.9) lib/active_support/notifications.rb:159:in `instrument' 
    actionpack (4.1.9) lib/action_controller/metal/instrumentation.rb:30:in `process_action' 
    actionpack (4.1.9) lib/action_controller/metal/params_wrapper.rb:250:in `process_action' 
    activerecord (4.1.9) lib/active_record/railties/controller_runtime.rb:18:in `process_action' 
    actionpack (4.1.9) lib/abstract_controller/base.rb:136:in `process' 
    actionview (4.1.9) lib/action_view/rendering.rb:30:in `process' 
    actionpack (4.1.9) lib/action_controller/metal.rb:196:in `dispatch' 
    actionpack (4.1.9) lib/action_controller/metal/rack_delegation.rb:13:in `dispatch' 
    actionpack (4.1.9) lib/action_controller/metal.rb:232:in `block in action' 
    actionpack (4.1.9) lib/action_dispatch/routing/route_set.rb:82:in `dispatch' 
    actionpack (4.1.9) lib/action_dispatch/routing/route_set.rb:50:in `call' 
    actionpack (4.1.9) lib/action_dispatch/routing/mapper.rb:45:in `call' 
    actionpack (4.1.9) lib/action_dispatch/journey/router.rb:73:in `block in call' 
    actionpack (4.1.9) lib/action_dispatch/journey/router.rb:59:in `each' 
    actionpack (4.1.9) lib/action_dispatch/journey/router.rb:59:in `call' 
    actionpack (4.1.9) lib/action_dispatch/routing/route_set.rb:685:in `call' 
    omniauth (1.4.2) lib/omniauth/strategy.rb:186:in `call!' 
    omniauth (1.4.2) lib/omniauth/strategy.rb:164:in `call' 
    omniauth (1.4.2) lib/omniauth/strategy.rb:186:in `call!' 
    omniauth (1.4.2) lib/omniauth/strategy.rb:164:in `call' 
    meta_request (0.3.4) lib/meta_request/middlewares/app_request_handler.rb:13:in `call' 
    meta_request (0.3.4) lib/meta_request/middlewares/meta_request_handler.rb:13:in `call' 
    warden (1.2.6) lib/warden/manager.rb:35:in `block in call' 
    warden (1.2.6) lib/warden/manager.rb:34:in `catch' 
    warden (1.2.6) lib/warden/manager.rb:34:in `call' 
    rack (1.5.5) lib/rack/etag.rb:23:in `call' 
    rack (1.5.5) lib/rack/conditionalget.rb:25:in `call' 
    rack (1.5.5) lib/rack/head.rb:11:in `call' 
    actionpack (4.1.9) lib/action_dispatch/middleware/params_parser.rb:27:in `call' 
    actionpack (4.1.9) lib/action_dispatch/middleware/flash.rb:254:in `call' 
    rack (1.5.5) lib/rack/session/abstract/id.rb:225:in `context' 
    rack (1.5.5) lib/rack/session/abstract/id.rb:220:in `call' 
    actionpack (4.1.9) lib/action_dispatch/middleware/cookies.rb:562:in `call' 
    activerecord (4.1.9) lib/active_record/query_cache.rb:36:in `call' 
    activerecord (4.1.9) lib/active_record/connection_adapters/abstract/connection_pool.rb:621:in `call' 
    activerecord (4.1.9) lib/active_record/migration.rb:380:in `call' 
    actionpack (4.1.9) lib/action_dispatch/middleware/callbacks.rb:29:in `block in call' 
    activesupport (4.1.9) lib/active_support/callbacks.rb:82:in `run_callbacks' 
    actionpack (4.1.9) lib/action_dispatch/middleware/callbacks.rb:27:in `call' 
    actionpack (4.1.9) lib/action_dispatch/middleware/reloader.rb:73:in `call' 
    actionpack (4.1.9) lib/action_dispatch/middleware/remote_ip.rb:76:in `call' 
    better_errors (2.1.1) lib/better_errors/middleware.rb:84:in `protected_app_call' 
    better_errors (2.1.1) lib/better_errors/middleware.rb:79:in `better_errors_call' 
    better_errors (2.1.1) lib/better_errors/middleware.rb:57:in `call' 
    rack-contrib (1.2.0) lib/rack/contrib/response_headers.rb:17:in `call' 
    meta_request (0.3.4) lib/meta_request/middlewares/headers.rb:16:in `call' 
    actionpack (4.1.9) lib/action_dispatch/middleware/debug_exceptions.rb:17:in `call' 
    actionpack (4.1.9) lib/action_dispatch/middleware/show_exceptions.rb:30:in `call' 
    railties (4.1.9) lib/rails/rack/logger.rb:38:in `call_app' 
    railties (4.1.9) lib/rails/rack/logger.rb:20:in `block in call' 
    activesupport (4.1.9) lib/active_support/tagged_logging.rb:68:in `block in tagged' 
    activesupport (4.1.9) lib/active_support/tagged_logging.rb:26:in `tagged' 
    activesupport (4.1.9) lib/active_support/tagged_logging.rb:68:in `tagged' 
    railties (4.1.9) lib/rails/rack/logger.rb:20:in `call' 
    quiet_assets (1.1.0) lib/quiet_assets.rb:27:in `call_with_quiet_assets' 
    actionpack (4.1.9) lib/action_dispatch/middleware/request_id.rb:21:in `call' 
    rack (1.5.5) lib/rack/methodoverride.rb:21:in `call' 
    rack (1.5.5) lib/rack/runtime.rb:17:in `call' 
    activesupport (4.1.9) lib/active_support/cache/strategy/local_cache_middleware.rb:26:in `call' 
    rack (1.5.5) lib/rack/lock.rb:17:in `call' 
    actionpack (4.1.9) lib/action_dispatch/middleware/static.rb:84:in `call' 
    rack (1.5.5) lib/rack/sendfile.rb:112:in `call' 
    railties (4.1.9) lib/rails/engine.rb:514:in `call' 
    railties (4.1.9) lib/rails/application.rb:144:in `call' 
    rack (1.5.5) lib/rack/lock.rb:17:in `call' 
    rack (1.5.5) lib/rack/content_length.rb:14:in `call' 
    rack (1.5.5) lib/rack/handler/webrick.rb:60:in `service' 
    /Users/jimmiejackson/.rvm/rubies/ruby-2.3.3/lib/ruby/2.3.0/webrick/httpserver.rb:140:in `service' 
    /Users/jimmiejackson/.rvm/rubies/ruby-2.3.3/lib/ruby/2.3.0/webrick/httpserver.rb:96:in `run' 
    /Users/jimmiejackson/.rvm/rubies/ruby-2.3.3/lib/ruby/2.3.0/webrick/server.rb:296:in `block in start_thread' 

S'il vous plaît laissez-moi savoir s'il y a un autre code que vous pourriez avoir besoin de voir. Merci pour votre aide, cela me rend fou!

Répondre

1

Vous avez des espaces de noms OmniauthCallbacksController sous les utilisateurs comme Users::OmniauthCallbacksController, assurez-vous que le chemin du contrôleur est your_app/app/controllers/users/omniauth_callbacks_controller‌​.rb dire, il se trouve sous le dossier users. De même, vos itinéraires devise devraient ressembler à:

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

Note:users/omniauth_callbacks

MISE À JOUR

En regardant les itinéraires que vous avez partagé, vous devez mettre à jour les routes pour upgrade et setup comme:

devise_scope :user do 
    get '/users/auth/:provider/upgrade' => 'users/omniauth_callbacks#upgrade', as: :user_omniauth_upgrade 
    get '/users/auth/:provider/setup', :to => 'users/omniauth_callbacks#setup' 
    end 

Encore une fois, Note:users/omniauth_callbacks

+0

Ils sont certainement dans les utilisateurs dossier et correctement espaces de noms. J'ai ajouté mes routes et mon modèle FormUser si cela vous aide. –

+0

@ J.Jackson Merci! Cela a sûrement aidé.Lisez la section Mise à jour de ma réponse. –

+0

Ah, bien sûr, cela prend tout son sens! Maintenant, je reçois une 'méthode non définie' user_omniauth_authorize_path 'pour # Vouliez-vous dire? user_omniauth_upgrade_path erreur user_github_omniauth_authorize_path' cependant. J'ai ajouté ma commande de terminal stack trace et rake routes. Aussi, merci beaucoup pour votre aide! –