ruby on rails - OmniAuth::NoSessionError - You must provide a session to use OmniAuth. (configured in devise) -


hi learning how use omniauth backend ember app.

when run application below mentioned erroe omniauth::nosessionerror - must provide session use omniauth

on resue rails s applicataion halts @ line below.

  172: def call!(env) # rubocop:disable cyclomaticcomplexity     173:   unless env['rack.session']     174:     error = omniauth::nosessionerror.new('you must provide session use omniauth.')  => 175:     fail(error)     176:   end     177:  

config/intializer/devise

devise.setup |config|    config.mailer_sender = 'please-change-me-at-config-initializers-devise@example.com'   require 'devise/orm/active_record'   config.case_insensitive_keys = [ :email ]   config.strip_whitespace_keys = [ :email ]   config.http_authenticatable = true   config.skip_session_storage = [:http_auth]   config.stretches = rails.env.test? ? 1 : 10   config.reconfirmable = true   config.expire_all_remember_me_on_sign_out = true   config.password_length = 8..128   config.reset_password_within = 6.hours   config.http_authenticatable_on_xhr = false   config.navigational_formats = ['*/*', :html,:json]   config.sign_out_via = :delete   require 'omniauth-facebook'   config.omniauth :facebook, env['8987087080'] , env['3d6a359a37c8780870dxxxx5'],:strategy_class => omniauth::strategies::facebook end 

config/intializer/session_store.rb

rails.application.config.session_store :disabled 

routes.rb

rails.application.routes.draw    namespace :api     namespace :v1       resources :users       resources :games     end   end    activeadmin.routes(self)   #devise_for :admin_users, activeadmin::devise.config   devise_for :users, controllers: {      omniauth_callbacks: 'omniauth_callbacks',     sessions: 'sessions' ,      registrations: "registrations",     }    devise_scope :user      match 'users/sign_in', to: 'sessions#create', via: :post     match 'api/v1/users' , to: 'registrations#create' , via: :post   end  end 

gemfile.rb

source 'https://rubygems.org'  # bundle edge rails instead: gem 'rails', github: 'rails/rails' gem 'rails', '4.1.6'  platforms :ruby # linux   gem 'unicorn'   gem 'foreman'   gem 'delayed_job_active_record' end group :development, :test     gem 'compass'     gem 'pry'     gem 'pry-remote'     gem 'pry-rails'     gem 'pry-rescue'     gem 'pry-stack_explorer'     gem 'pry-byebug'     gem 'guard'     gem 'guard-livereload'     gem 'guard-rails'     gem 'guard-rspec'     gem 'guard-cucumber'     gem 'guard-zeus'     gem 'rspec-rails'  end group :production     #gem 'pg' end  #authentication gem 'cancan' gem 'rolify' gem 'devise' gem 'omniauth' gem 'omniauth-facebook', '=1.4.0' gem 'oauth2'    # use scss stylesheets gem 'sass-rails', '~> 4.0.0' gem 'bootstrap-sass', '~> 3.1.1' gem 'bootswatch-rails'  # use uglifier compressor javascript assets gem 'uglifier', '>= 1.3.0'    # see https://github.com/sstephenson/execjs#readme more supported runtimes # gem 'therubyracer', platforms: :ruby  # use jquery javascript library gem 'jquery-rails'   group :doc   # bundle exec rake doc:rails generates api under doc/api.   gem 'sdoc', require: false end  #ember gem "active_model_serializers" gem "ember-source", "~>1.7.0"  #asyc http calls gem 'hashie_rails' gem "typhoeus" gem "virtus"  #middleware gem "rack-cors", require: 'rack/cors'    platforms :mswin    gem "wdm", :group => [:development, :test] end #gem 'wdm', '>= 0.1.0'  # windows not include zoneinfo files, bundle tzinfo-data gem gem 'tzinfo-data', platforms: [:mingw, :mswin] 

it because disabled session middleware (look @ output of rake middleware). omniauth not work without session middleware.

you disabled here: rails.application.config.session_store :disabled

if trying ditch session because not use other omniauth, thing can write own middleware injects actiondispatch::session::cookiestore , possibly other necessary middlewares based on url (i.e. if url /auth/*). here example of use achieve (only uses session if url path not /api/...):

# /config/application.rb config.middleware.insert_before actiondispatch::paramsparser, "selectivestack"  # /config/initializers/omniauth.rb ::omniauthconfig = proc.new   provider :github, # ... end  # /app/middleware/selective_stack.rb class selectivestack   def initialize(app)     @app = app   end    def call(env)     if env["path_info"].start_with?("/api/") # <--- change url path here       @app.call(env)     else       middleware_stack.build(@app).call(env)     end   end  private   def middleware_stack     @middleware_stack ||= begin       actiondispatch::middlewarestack.new.tap |middleware|         # needed omniauth         middleware.use actiondispatch::cookies         middleware.use rails.application.config.session_store, rails.application.config.session_options         middleware.use omniauth::builder, &omniauthconfig         # needed doorkeeper /oauth views         middleware.use actiondispatch::flash       end     end   end end 

in example enable session middleware when url not start /api/. will still need remove rails.application.config.session_store :disabled , set session store, of course. in example use cookie store. might need tweak example based on middleware missing in rake middleware. if you're not doing performance reasons reenable session middleware.


Comments

Popular posts from this blog

c++ - QTextObjectInterface with Qml TextEdit (QQuickTextEdit) -

javascript - angular ng-required radio button not toggling required off in firefox 33, OK in chrome -

xcode - Swift Playground - Files are not readable -