2015-12-06 5 views
0

Я использую Omniauth с Devise в моем приложении rails. Мне удалось правильно войти в аккаунт, когда они используют omniauth (в данном случае, facebook). Когда пользователь пытается войти в систему, используя свой адрес электронной почты и пароль вместо omniauth, приложение все равно будет регистрировать пользователя, но не сохраняет сеанс. Таким образом, кнопка выключения не отображается, и пользователь не может делать то, что он/она предполагает делать.Разработка не обязательной сессии (Omniauth) в Rails 4

Это мой маршрут для пользователя:

devise_for :users, path_names: {sign_in: "login", sign_out: "logout"}, controllers: {registrations: 'registrations', omniauth_callbacks: "omniauth_callbacks"}, :skip => [:sessions] 
    as :user do 
    get 'sign-in' => 'devise/sessions#new', :as => :new_user_session 
    post 'sign-in' => 'devise/sessions#create', :as => :user_session 

    get '/users/sign_out' => 'devise/sessions#destroy' 

    resources :users_admin, :controller => 'users' 

    end 

Это мой OmniauthCallbacksController:

class OmniauthCallbacksController < Devise::OmniauthCallbacksController 
    def all 
     user = User.from_omniauth(request.env["omniauth.auth"]) 
     if user.persisted? 
      session[:user_id] = user.id 
      sign_in_and_redirect user, notice: "Signed in!" 
     else 
      session["devise.user_attributes"] = user.attributes 
      redirect_to new_user_registration_url 
     end 
    end 
    alias_method :facebook, :all  
end 

Это мой SessionController:

class SessionsController < ApplicationController 

    def create 
     user = User.from_omniauth(env["omniauth.auth"]) 
     session[:user_id] = user.id 
     redirect_to root_url 
    end 

    def destroy 
     session[:user_id] = nil 
     redirect_to root_url 
    end 

end 

И учебник, который я следующее здесь: https://www.youtube.com/watch?v=X6tKAUOMzCs

Пожалуйста, помогите .. спасибо!

ответ

0

Код SessionController неверен. В действии create вы пытаетесь аутентифицировать пользователя из omniauth, но этот контроллер не используется для аутентификации OAuth. Вот почему он ничего не сохраняет в сеансе. Кроме того, есть опечатка: вы используете env["omniauth.auth"] вместо request.env["omniauth.auth"].

На самом деле, вам не нужно изменять SessionController или создавать свои собственные. Devise по умолчанию SessionController отлично работает. Вам просто нужно включить Omniauthable, подключить omniauth-provider и все. Настройки маршрута будет выглядеть следующим образом:

devise_for :users, controllers: {omniauth_callbacks: 'omniauth_callbacks'} 

Вы можете найти код с видео в этом репо: https://github.com/railscasts/235-devise-and-omniauth-revised/tree/master/blog-after Надеюсь, это поможет вам.