gpt4 book ai didi

ruby-on-rails - 设计 Google Oauth 可以完美运行,但不会在用户创建时登录,需要额外登录

转载 作者:行者123 更新时间:2023-12-03 16:03:00 25 4
gpt4 key购买 nike

我在 Rails 3.2 应用程序上运行了 Devise。 Google Oauth 用于登录。
新用户尝试使用 Google 登录并在未登录的情况下被重定向到登录页面。我检查了数据库,并且用户的帐户是使用正确的凭据创建的(除 IP 外,所有内容都是正确的)。
返回用户登录没有问题,注销也可以完美运行。
我不确定我做错了什么,我遵循了本教程:http://blogs.burnsidedigital.com/2013/03/rails-3-devise-omniauth-and-google/
不同之处在于我不需要额外的用户信息,我只想通过他们的谷歌帐户对用户进行身份验证,确保他们属于某个域 foobar.com我有一个 OmniAuth Controller ,如下所示:

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
对于未登录的访问者,我调用 posts#login
class PostsController < ApplicationController
...
def login
Rails.logger.debug(current_user)
if current_user
redirect_to :root
end
end
...
并且 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
为什么新帐户没有登录?为什么会创建他们的帐户但未登录?
非常感谢任何帮助,我完全被难住了(设计文档没有引导我找到解决方案)。
编辑
以下是新用户登录/注册的开发日志:
>> 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

最佳答案

您说“新用户尝试使用 Google 登录并在未登录的情况下被重定向到登录页面”,我不能 100% 确定这意味着什么。每次您使用 Google OAuth 让某人进入您的应用程序时,他们都会看到一次性批准屏幕,以便他们有机会说他们是否同意将他们的身份发送到您的应用程序。如果他们已经登录,他们真的不应该去登录页面。他们去哪个页面?

关于ruby-on-rails - 设计 Google Oauth 可以完美运行,但不会在用户创建时登录,需要额外登录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20021204/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com