ruby-on-rails – Devise Google Oauth完美运行但未登录用户创建
我在我的Rails 3.2应用程序上运行了Devise. Google Oauth用于登录.
新用户尝试使用Google登录,并在未登录的情况下重定向到登录页面.我检查数据库,并使用正确的凭据创建用户帐户(一切都正确,但IP除外). 返回用户登录时没有问题,退出也很有效. 我不确定我做错了什么,我遵循了这个教程:http://blogs.burnsidedigital.com/2013/03/rails-3-devise-omniauth-and-google/ 不同之处在于我不需要其他用户信息,我只想通过他们的谷歌帐户验证用户,确保他们属于某个域foobar.com 我有一个OmniAuth控制器,如下所示: class OmniauthCallbacksController < Devise::OmniauthCallbacksController def google_oauth2 auth = request.env["omniauth.auth"] proceeder = !!(auth.info.email =~ /^[a-zA-Z0-9.]+@foobar.com$/) if proceeder user = User.from_omniauth(auth) flash.notice = "Signed in!" sign_in_and_redirect user redirect_to :root else flash[:notice] = "You must use an email ending in @foobar.com" redirect_to signup_path end 我的用户模型如下: class User < ActiveRecord::Base has_many :posts has_many :comments has_many :votes has_many :reports devise :database_authenticatable,:registerable,:omniauthable,:recoverable,:rememberable,:trackable,:validatable#,:omniauth_providers => [:google_oauth2] attr_accessible :email,:password,:password_confirmation,:remember_me,:provider,:uid def self.from_omniauth(auth) if user = User.find_by_email(auth.info.email) user.provider = auth.provider user.uid = auth.uid user else where(auth.slice(:provider,:uid)).first_or_create do |user| user.provider = auth.provider user.uid = auth.uid user.email = auth.info.email user end end end end 对于未登录的访问者,我呼叫帖子#login class PostsController < ApplicationController ... def login Rails.logger.debug(current_user) if current_user redirect_to :root end end ... root_path包含一个current_user检查,如果没有用户登录,它会重定向到帖子#login. 我认为问题出在sign_in_and_redirect方法中,所以我将以下内容添加到ApplicationController: class ApplicationController < ActionController::Base protect_from_forgery serialization_scope :view_context def after_sign_in_path_for(resource) root_url end def after_sign_up_path_for(resource) root_url end end 为什么新帐户没有登录?为什么要创建他们的帐户但未登录? 非常感谢任何帮助,我完全难过(Devise文档没有引导我找到解决方案). 编辑 以下是登录/注册的新用户的开发日志: >> Listening on 0.0.0.0:3000,CTRL+C to stop Started GET "/signup" for 127.0.0.1 at 2013-11-16 16:58:54 -0500 Processing by PostsController#login as HTML Rendered posts/login.html.erb within layouts/application (24.0ms) Completed 200 OK in 31ms (Views: 30.6ms | ActiveRecord: 0.0ms) (google_oauth2) Request phase initiated. Started GET "/users/auth/google_oauth2" for 127.0.0.1 at 2013-11-16 16:58:56 -0500 (google_oauth2) Callback phase initiated. Started GET "/users/auth/google_oauth2/callback?state=e5c02458190b79758da474baa623717a29078427ad6049f7&code=4/yimrxaCXMOY_FTZyAgd_-CpZxMrF.EhatByjkrMkYshQV0ieZDAoQx9zFhAI" for 127.0.0.1 at 2013-11-16 16:59:00 -0500 Processing by OmniauthCallbacksController#google_oauth2 as HTML Parameters: {"state"=>"e5c02458190b79758da474baa623717a29078427ad6049f7","code"=>"4/yimrxaCXMOY_FTZyAgd_-CpZxMrF.EhatByjkrMkYshQV0ieZDAoQx9zFhAI"} User Load (54.0ms) SELECT "users".* FROM "users" WHERE "users"."email" = 'jquadr01@foobar.com' LIMIT 1 User Load (0.3ms) SELECT "users".* FROM "users" WHERE "users"."provider" = 'google_oauth2' AND "users"."uid" = '105565017494971239846' LIMIT 1 (0.1ms) BEGIN User Exists (0.4ms) SELECT 1 AS one FROM "users" WHERE "users"."email" = 'jquadr01@foobar.com' LIMIT 1 (0.1ms) ROLLBACK (0.1ms) BEGIN SQL (76.2ms) INSERT INTO "users" ("created_at","current_sign_in_at","current_sign_in_ip","email","encrypted_password","last_sign_in_at","last_sign_in_ip","provider","remember_created_at","reset_password_sent_at","reset_password_token","sign_in_count","uid","updated_at") VALUES ($1,$2,$3,$4,$5,$6,$7,$8,$9,$10,$11,$12,$13,$14) RETURNING "id" [["created_at",Sat,16 Nov 2013 21:59:01 UTC +00:00],["current_sign_in_at",["current_sign_in_ip","127.0.0.1"],["email","jquadr01@foobar.com"],["encrypted_password",""],["last_sign_in_at",["last_sign_in_ip",["provider","google_oauth2"],["remember_created_at",nil],["reset_password_sent_at",["reset_password_token",["sign_in_count",1],["uid","1055650112345678911846"],["updated_at",16 Nov 2013 21:59:01 UTC +00:00]] (16.9ms) COMMIT #<User:0x000000020d7a08> Redirected to http://localhost:3000/ Completed 302 Found in 338ms (ActiveRecord: 162.0ms) Started GET "/" for 127.0.0.1 at 2013-11-16 16:59:01 -0500 Processing by MainController#index as HTML User Load (0.8ms) SELECT "users".* FROM "users" WHERE "users"."id" IS NULL LIMIT 1 Redirected to http://localhost:3000/signup Completed 302 Found in 5ms (ActiveRecord: 0.8ms) Started GET "/signup" for 127.0.0.1 at 2013-11-16 16:59:01 -0500 Processing by PostsController#login as HTML Rendered posts/login.html.erb within layouts/application (0.5ms) Completed 200 OK in 4ms (Views: 2.7ms | ActiveRecord: 0.0m 解决方法
您说“新用户尝试使用Google登录并在未登录的情况下重定向到登录页面”,我并不完全确定这意味着什么.每当您使用Google OAuth让某人进入您的应用时,他们就会看到一次性批准屏幕,这样他们就有机会说出他们的身份是否可以发送到您的应用.如果他们已经登录,他们真的不应该去登录页面.他们去哪个页面?
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |