设计Google Oauth完美无缺,但无法登录用户创建,需要额外登录

god*_*000 5 ruby-on-rails helpers devise oauth-2.0 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
Run Code Online (Sandbox Code Playgroud)

我的用户模型如下:

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
Run Code Online (Sandbox Code Playgroud)

对于未登录的访客,我打电话 posts#login

class PostsController < ApplicationController
...
def login
    Rails.logger.debug(current_user)
    if current_user
            redirect_to :root
    end
end
...
Run Code Online (Sandbox Code Playgroud)

如果没有用户登录,则root_path包含一个current_user重定向到的检查posts#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
Run Code Online (Sandbox Code Playgroud)

为什么新帐户没有登录?为什么要创建他们的帐户但未登录?

非常感谢任何帮助,我完全难过(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", Sat, 16 Nov 2013 21:59:01 UTC +00:00], ["current_sign_in_ip", "127.0.0.1"], ["email", "jquadr01@foobar.com"], ["encrypted_password", ""], ["last_sign_in_at", Sat, 16 Nov 2013 21:59:01 UTC +00:00], ["last_sign_in_ip", "127.0.0.1"], ["provider", "google_oauth2"], ["remember_created_at", nil], ["reset_password_sent_at", nil], ["reset_password_token", nil], ["sign_in_count", 1], ["uid", "1055650112345678911846"], ["updated_at", Sat, 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
Run Code Online (Sandbox Code Playgroud)

Tim*_*ray 1

您说 \xe2\x80\x9cNew 用户尝试使用 Google 登录,并在未登录的情况下被重定向到登录页面\xe2\x80\x9d,而我\xe2\x80\x99m 不能 100% 确定这意味着什么。每次您使用 Google OAuth 让某人进入您的应用程序时,他们\xe2\x80\x99 都会看到一次性批准屏幕,以便他们有机会表明他们\xe2\x80\x99 是否同意自己的身份被发送到您的应用程序。他们确实不应该\xe2\x80\x99 去登录页面。他们会进入哪个页面?

\n