OmniAuth:: NoSessionError - вы должны предоставить сеанс для использования OmniAuth. (сконфигурированный в разработке)
Привет, я изучаю, как использовать omniauth в качестве backend для приложения ember.
когда я запускаю свое приложение, я получаю приведенный ниже erroe
OmniAuth:: NoSessionError - вы должны предоставить сеанс для использования OmniAuth
в resue rails s моя аппликация останавливается в строке ниже.
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:
конфигурация/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
конфигурации/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]
Ответы
Ответ 1
Это связано с тем, что вы отключили промежуточное программное обеспечение сеанса (посмотрите на вывод rake middleware
). Omniauth не будет работать без промежуточного программного обеспечения сеанса.
Вы отключили его здесь: Rails.application.config.session_store :disabled
Если вы пытаетесь провести сеанс, потому что вы не используете его, кроме как для Omniauth, тогда единственное, что вы можете сделать, это написать свое собственное промежуточное программное обеспечение, которое вводит ActionDispatch::Session::CookieStore
и, возможно, другие необходимые посредники на основе URL-адреса (т.е. если URL-адрес /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
и правильно настроить хранилище сеансов, конечно. В моем примере я использую хранилище файлов cookie. Возможно, вам понадобится настроить мой пример на основе того, какое промежуточное программное обеспечение отсутствует в rake middleware
. Но если вы не делаете этого по соображениям производительности, просто переустановите промежуточное ПО сеанса.
Ответ 2
В приложение .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