Google 与 "devise" 的身份验证失败

Google authentification with "devise" fail

我想在我的应用程序中创建一个 GOOGLE 身份验证。因此,正确设置 "omniauth" 和 "devise"(我认为)。在我的“_header.html.erb”视图中的布局文件夹中:

<% if user_signed_in? %>Signed in as <%= current_user.name %>. Not you?
<%= link_to "Sign out", destroy_user_session_path,:method => :delete %>
<% else %>
<%= link_to "Sign in with Google", user_omniauth_authorize_path(:google_oauth2) %>
<% end %>

当我尝试连接时,我点击此代码给出的 link 打开新页面,我选择我的 google 帐户然后接受权限,这将我重定向到同一页面。 (link 所在的位置)。我的数据库由帐户信息正确填充。

但是就像代码说的那样,我希望在连接后 header 打印连接帐户的名称,但事实并非如此。它再次打印 "Sign In with google".

此外,我想在连接后立即重定向到另一个页面。我怎么做。 也许我必须定义 user_signed_in? 方法,如果是这样的话,在哪里以及如何定义?

current_user 在 application_controller 中定义如下:

def current_user
  @current_user ||= User.find(session[:user_id]) if session[:user_id]
end

在我的用户模型中,我只有那个:

def self.find_for_google_oauth2(access_token, signed_in_resource=nil)
    data = access_token.info
    user = User.where(:provider => access_token.provider, :uid =>     access_token.uid ).first

    unless user
      #registered_user = User.where(:email => access_token.info.email).first

      #if registered_user
      #  return registered_user
      #else
        user = User.create(
          name: data["name"],
          provider:access_token.provider,
          email: data["email"],
          uid: access_token.uid ,
          password: Devise.friendly_token[0,20],
        )
      #end

   end
   p user
   user
end

希望你能帮助我。

提前致谢。

PS : 如果你想要一些代码,只需说评论,我会用代码的一部分编辑问题。

创建一个 OmniauthCallbacksController 并添加以下代码

class OmniauthCallbacksController < ApplicationController

  skip_before_filter :authenticate_user!
  def all
    p env["omniauth.auth"]
    user = User.from_omniauth(env["omniauth.auth"])
    if user.persisted?
      flash[:notice] = "You are in..!!! Go to edit profile to see the status for the accounts"
      sign_in_and_redirect(user)
    else
      session["devise.user_attributes"] = user.attributes
      redirect_to new_user_registration_url
    end
  end

  def failure
    #handle you logic here..
    #and delegate to super.
    super
  end

  alias_method :google_oauth2, :all
end

在你的config/routes.rb

devise_for :users, controllers: { omniauth_callbacks: "omniauth_callbacks" }

创建授权模型

rails g model Authorization

在迁移中添加以下代码

class CreateAuthorizations < ActiveRecord::Migration
  def change
    create_table :authorizations do |t|
      t.string :provider
      t.string :uid
      t.integer :user_id
      t.string :token
      t.string :secret
      t.timestamps
    end
  end
end

然后

rake db:migrate

在你的models/authorization.rb

belongs_to :user

在你的models/user.rb

has_many :authorizations

def self.from_omniauth(auth)
  authorization = Authorization.where(:provider => auth.provider, :uid => auth.uid.to_s).first_or_initialize
  authorization.token = auth.credentials.token
  if authorization.user.blank?
    user = User.where('email = ?', auth["info"]["email"]).first
    if user.blank?
     user = User.new
     user.password = Devise.friendly_token[0,10]
     user.email = auth.info.email
     user.save
    end
   authorization.user_id = user.id
   if auth.provider == "google_oauth2"
    authorization.secret = auth.credentials.refresh_token !auth.credentials.refresh_token.blank?
    authorization.secret = auth.credentials.secret 
   end
  end
  authorization.save
  authorization.user
end

希望对您有所帮助。