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