【发布时间】:2020-09-23 11:53:18
【问题描述】:
我有 omniauth-facebook 注册/登录。登录后,我想将用户重定向到他们点击 auth 块的页面。我正在使用 sign_in_and_redirect 但它似乎正在调用最后一个 url,在这种情况下是
http://localhost:3000/auth/facebook?callback_url=localhost%2Fauth%2Ffacebook%2Fcallback
所以它一直在做:
Redirected to http://localhost:3000/auth/facebook?callback_url=localhost%2Fauth%2Ffacebook%2Fcallback
它会一直循环调用这个回调,直到它崩溃。这是omniauth控制器:
def facebook
generic_callback( 'facebook' )
end
def generic_callback( provider )
@identity = Identity.find_for_oauth env["omniauth.auth"]
if @identity.user != nil
@user = @identity.user || current_user
else
@user = User.from_omniauth(request.env["omniauth.auth"])
end
if @user.nil?
@user = User.create( email: @identity.email || "" )
@identity.update_attribute( :user_id, @user.id )
end
if @user.email.blank? && @identity.email
@user.update_attribute( :email, @identity.email)
end
if @user.persisted?
@identity.update_attribute( :user_id, @user.id )
@user = User.find(@user.id)
sign_in_and_redirect @user, event: :authentication
return
else
session["devise.#{provider}_data"] = env["omniauth.auth"]
redirect_to new_user_registration_url
return
end
end
设计助手:
def sign_in_and_redirect(resource_or_scope, *args)
options = args.extract_options!
scope = Devise::Mapping.find_scope!(resource_or_scope)
resource = args.last || resource_or_scope
sign_in(scope, resource, options)
redirect_to after_sign_in_path_for(resource)
end
路线
resources :users
devise_for :users, controllers: { registrations: "users/registrations", sessions: "users/sessions", :omniauth_callbacks => "users/omniauth_callbacks" }, path: '', path_names: { sign_in: 'sign_in', sign_out: 'logout', sign_up: 'sign_up'}
match '/auth/:provider/callback', to: 'sessions#create', via: [:get, :post]
如何让它定期登录?
【问题讨论】:
-
您能否提供更多背景信息?问题中省略了任何与设计相关的代码吗?也许您在
ApplicationController或其他地方覆盖了after_sign_in_path_for?我之所以问,是因为我在结构上与问题中描述的代码相同,并且它可以按预期开箱即用。 -
谢谢!现在很清楚了。请参阅我的更新答案。
标签: ruby-on-rails devise omniauth-facebook