我在我的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
请帮忙..谢谢!
答案 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 user
将sign_in user
添加到user
并设置会话。
current_user
结束