2016-04-29 67 views
0

在我的rails應用程序中使用devise並且一切工作正常,我現在要做的是讓用戶使用他們的github帳戶登錄到我的應用並創建一個配置文件。使用設計創建一個auth用戶

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 

我也跑了正確的遷移增加供應商和UID列到用戶表

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

經過在設計的維基有人說:

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

但我刪除了那個where方法。現在發生的是你從數據庫中取出FIRST記錄並進行更新。

如果數據庫中沒有記錄,則會創建一條記錄,但在後續註冊時,您仍然會獲取第一條記錄並進行修改。所以我改變:

我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"]) 
1

你給的憑證配置/初始化/ 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

相關問題