使用devise创建一个auth用户

时间:2016-04-29 09:53:43

标签: ruby-on-rails ruby-on-rails-4 oauth devise

我在我的rails应用程序中使用devise并且一切正常,我现在尝试做的是允许用户使用他们的github帐户登录我的应用程序并创建个人资料。

User.rb

class User < ActiveRecord::Base
  # Include default devise modules. Others available are:
  # :confirmable, :lockable, :timeoutable and :omniauthable
  devise :database_authenticatable, :registerable,
         :recoverable, :rememberable, :trackable, :validatable, :omniauthable

  has_one :profile

  after_create :build_profile

  def build_profile
    self.create_profile
  end

  def self.create_with_omniauth(auth)
    user = first_or_create do |user|
      user.provider = auth['provider']
      user.uid = auth['uid']
      user.email = auth['info']['email']
      user.password = Devise.friendly_token[0,20]
    end
  end
end

的routes.rb

devise_for :users, :controllers => { :omniauth_callbacks => "callbacks" }

callbacks_controller.rb

class CallbacksController < Devise::OmniauthCallbacksController
  def github
    @user = User.from_omniauth(request.env["omniauth.auth"])
    sign_in_and_redirect @user
  end
end

我还运行了正确的迁移,将provider和uid列添加到users表

rails g migration AddColumnsToUsers provider uid

def change
 add_column :users, :provider, :string
 add_column :users, :uid, :string
end

配置/初始化/ devise.rb

config.omniauth :github, 'CLIENT_ID', 'APP_SECRET', :scope => 'user:email'

当我使用devise创建用户时,一切正常并且用户已创建,但当我在我的注册页面上单击使用github登录时,它会合并设备帐户和github帐户,从而为我留下一个帐户,它没有使用用户github凭据创建帐户。即使我尝试使用2个不同的github帐户登录,它仍然出于某种原因只使用第一个github帐户。

问题是github用户可以登录,但他们没有被创建为用户,使用他们的github凭据,我需要用户登录并与我一起创建个人资料。

2 个答案:

答案 0 :(得分:1)

您是否在 config / initializers / omniauth.rb

中提供了凭据?
Rails.application.config.middleware.use OmniAuth::Builder do
  provider :github, ENV['GITHUB_KEY'], ENV['GITHUB_SECRET'], scope:"user:email,user:follow"
end

您可以通过Link

查看

答案 1 :(得分:0)

在Devise的维基中,有人说:

where(provider: auth.provider, uid: auth.uid).first_or_create do |user|

但我删除了where方法。现在发生的事情是你从数据库中获取第一条记录并更新它。

如果数据库中没有记录,则会创建一条记录,但在子请求注册时,您仍将获取第一条记录并对其进行修改。所以我改变了:

我的User.rb:

def self.from_omniauth(auth)
    user = where(provider: auth.provider, uid: auth.uid).first_or_create do |user|
      user.email = auth.info.email
      user.password = Devise.friendly_token[0,20]
    end
  end

并回调控制器:

@user = User.from_omniauth(request.env["omniauth.auth"])