加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

ruby-on-rails – Devise Google Oauth完美运行但未登录用户创建

发布时间:2020-12-16 21:01:12 所属栏目:百科 来源:网络整理
导读:我在我的Rails 3.2应用程序上运行了Devise. Google Oauth用于登录. 新用户尝试使用Google登录,并在未登录的情况下重定向到登录页面.我检查数据库,并使用正确的凭据创建用户帐户(一切都正确,但IP除外). 返回用户登录时没有问题,退出也很有效. 我不确定我做错
我在我的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让某人进入您的应用时,他们就会看到一次性批准屏幕,这样他们就有机会说出他们的身份是否可以发送到您的应用.如果他们已经登录,他们真的不应该去登录页面.他们去哪个页面?

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读