我在我的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凭据,我需要用户登录并与我一起创建个人资料。
答案 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"])