2014-11-14 5 views
11

हाय मैं सीख रहा हूं कि omberiauth को एम्बर ऐप के बैकएंड के रूप में कैसे उपयोग करें।OmniAuth :: NoSessionError - आपको OmniAuth का उपयोग करने के लिए एक सत्र प्रदान करना होगा। (तैयार करने में कॉन्फ़िगर किया गया)

जब मैं अपने आवेदन को चलाने मैं नीचे उल्लेख erroe OmniAuth :: NoSessionError - आप resue रेल मेरे applicataion पर OmniAuth

उपयोग करने के लिए एक सत्र प्रदान करनी चाहिए नीचे लाइन पर रुकती है।

172: def call!(env) # rubocop:disable CyclomaticComplexity 
    173: unless env['rack.session'] 
    174:  error = OmniAuth::NoSessionError.new('You must provide a session to use OmniAuth.') 
=> 175:  fail(error) 
    176: end 
    177: 

config/intializer/वसीयत

Devise.setup do |config| 

    config.mailer_sender = '[email protected]' 
    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 do 

    namespace :api do 
    namespace :v1 do 
     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 do 
    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 do # linux 
    gem 'unicorn' 
    gem 'foreman' 
    gem 'delayed_job_active_record' 
end 
group :development, :test do 
    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 do 
    #gem 'pg' 
end 

#authentication 
gem 'cancan' 
gem 'rolify' 
gem 'devise' 
gem 'omniauth' 
gem 'omniauth-facebook', '=1.4.0' 
gem 'oauth2' 



# Use SCSS for stylesheets 
gem 'sass-rails', '~> 4.0.0' 
gem 'bootstrap-sass', '~> 3.1.1' 
gem 'bootswatch-rails' 

# Use Uglifier as compressor for JavaScript assets 
gem 'uglifier', '>= 1.3.0' 



# See https://github.com/sstephenson/execjs#readme for more supported runtimes 
# gem 'therubyracer', platforms: :ruby 

# Use jquery as the JavaScript library 
gem 'jquery-rails' 


group :doc do 
    # bundle exec rake doc:rails generates the 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 do 
    gem "wdm", :group => [:development, :test] 
end 
#gem 'wdm', '>= 0.1.0' 

# Windows does not include zoneinfo files, so bundle the tzinfo-data gem 
gem 'tzinfo-data', platforms: [:mingw, :mswin] 

उत्तर

17

यह है क्योंकि आप सत्र मिडलवेयर (rake middleware के उत्पादन को देखने) अक्षम है। Omniauth सत्र midware के बिना काम नहीं करेगा।

आप इसे यहाँ अक्षम: Rails.application.config.session_store :disabled

आप सत्र खाई करने के लिए, क्योंकि आप इसे Omniauth के लिए के अलावा अन्य का उपयोग नहीं करते की कोशिश कर रहे हैं, तो केवल एक चीज आप कर सकते हैं अपने खुद के मिडलवेयर लिखते हैं कि injects हैActionDispatch::Session::CookieStore और संभावित रूप से यूआरएल के आधार पर अन्य आवश्यक मध्यवर्ती (यानी यदि यूआरएल /auth/* है)। यहाँ मैं क्या इस लक्ष्य को हासिल करने के लिए उपयोग का एक उदाहरण है (केवल सत्र का उपयोग करता है, तो URL पथ /api/... नहीं है):

# /config/application.rb 
config.middleware.insert_before ActionDispatch::ParamsParser, "SelectiveStack" 

# /config/initializers/omniauth.rb 
::OmniAuthConfig = Proc.new do 
    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 do |middleware| 
     # needed for OmniAuth 
     middleware.use ActionDispatch::Cookies 
     middleware.use Rails.application.config.session_store, Rails.application.config.session_options 
     middleware.use OmniAuth::Builder, &OmniAuthConfig 
     # needed for Doorkeeper /oauth views 
     middleware.use ActionDispatch::Flash 
     end 
    end 
    end 
end 

इस उदाहरण में जब URL /api/ साथ नहीं शुरू करता है मैं केवल सत्र मिडलवेयर सक्षम करें। आप को अभी भी Rails.application.config.session_store :disabled को हटाने की आवश्यकता है और निश्चित रूप से अपना सत्र स्टोर सेट अप करें। मेरे उदाहरण में मैं कुकी स्टोर का उपयोग करता हूं। आपको rake middleware में कौन सा मिडलवेयर गुम है, इस आधार पर आपको अपना उदाहरण ट्विक करने की आवश्यकता हो सकती है। लेकिन यदि आप प्रदर्शन कारणों से ऐसा नहीं कर रहे हैं तो बस सत्र मिडलवेयर को पुनः सक्षम करें।

+1

महान जवाब आदमी में! मैं इस काम की पुष्टि कर सकता हूं :-) – rept

+0

धन्यवाद। खुशी है कि यह आपके लिए भी काम करता है :) – mrbrdo

+0

कंसोल कमांड मिडलवेयर सूचीबद्ध करने के लिए 'रेक मिडलवेयर' नहीं है 'रैक मिडलवेयर' – max

5

application.rb

... 

config.api_only = true 
config.session_store :cookie_store, key: '_interslice_session' 
config.middleware.use ActionDispatch::Cookies # Required for all session management 
config.middleware.use ActionDispatch::Session::CookieStore, config.session_options 
+0

इस बारे में और अधिक https://github.com/omniauth/omniauth#integrating-omniauth-into-your-rails-api –

संबंधित मुद्दे