2014-11-14 5 views
11

Hallo ich lerne, wie Omniuthuth als Backend für Glut App zu verwenden.OmniAuth :: NoSessionError - Sie müssen eine Sitzung zur Verwendung von OmniAuth bereitstellen. (konfiguriert im Gerät)

, wenn ich meine Anwendung ausführen ich die unten genannten erroe OmniAuth :: NoSessionError - Sie müssen eine Sitzung zur Verfügung stellen OmniAuth verwenden

auf resue Schienen s meine applicataion hält unten an der Linie.

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/ersinnen

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] 

Antwort

17

Dies liegt daran, dass Sie die Session-Middleware deaktiviert haben (sehen Sie sich die Ausgabe von rake middleware an). Omniauth wird ohne die Session-Middleware nicht funktionieren.

Sie hier deaktiviert: Rails.application.config.session_store :disabled

Wenn Sie versuchen, Sitzung, zu Graben, weil Sie es nicht andere verwenden als für Omniauth, dann das einzige, was Sie tun können, Ihre eigene Middleware schreiben, die spritztActionDispatch::Session::CookieStore und möglicherweise andere notwendige Middlewares basierend auf der URL (dh wenn die URL /auth/* ist). Hier ist ein Beispiel dafür, was ich dies zu erreichen, verwenden (nur verwendet Session, wenn URL-Pfad nicht /api/... ist):

# /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 

In diesem Beispiel habe ich nur die Session-Middleware ermöglichen, wenn die URL funktioniert nicht Start mit /api/. Sie werden müssen immer noch Rails.application.config.session_store :disabled entfernen und Ihren Sitzungsspeicher natürlich richtig einrichten. In meinem Beispiel verwende ich den Cookie-Speicher. Möglicherweise müssen Sie mein Beispiel anhand der fehlenden Middleware optimieren, die Sie unter rake middleware finden. Aber wenn Sie dies aus Leistungsgründen nicht tun, dann reaktivieren Sie einfach die Session-Middleware.

+1

Großen Antwort Mann! Ich kann das bestätigen funktioniert :-) – rept

+0

Danke. Froh, dass es auch für Sie funktioniert :) – mrbrdo

+0

Der Konsolenbefehl Middleware aufzulisten ist 'Rake Middleware' nicht' Rack Middleware' – max

5

In 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

Mehr dazu https://github.com/omniauth/omniauth#integrating-omniauth-into-your-rails-api –