在Rails 4中设计不绑定会话(Omniauth)

时间:2015-12-06 01:31:32

标签: ruby-on-rails devise omniauth omniauth-facebook

我在我的rails应用程序中使用Omniauth和Devise。我设法让用户在使用omniauth时正确登录(在本例中为facebook)。当用户尝试使用他们的电子邮件和密码而不是omniauth登录时,应用程序仍会记录用户,但不会存储会话。因此,没有显示退出按钮,用户无法做他/她想要做的事情。

这是我的用户路线:

  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

请帮忙..谢谢!

2 个答案:

答案 0 :(得分:0)

SessionsController的代码错误。在create操作中,您尝试从omniauth对用户进行身份验证,但此控制器不用于OAuth身份验证。这就是为什么它不会在会话中保存任何内容。此外,似乎有一个错字:您使用env["omniauth.auth"]代替request.env["omniauth.auth"]

实际上,您无需修改​​SessionsController或创建自己的SessionsController。 Devise的默认SessionsController工作正常。你只需要打开Omniauthable,连接omniauth-provider就可以了。路线设置如下所示:

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

您可以在此回购中找到视频中的代码:https://github.com/railscasts/235-devise-and-omniauth-revised/tree/master/blog-after希望它能为您提供帮助。

答案 1 :(得分:0)

对我来说,仅在持久解决后添加const $ = require('jquery'); global.$ = global.jQuery = $;sign_in usersign_in user添加到user并设置会话。

current_user

结束