2014-06-06 60 views
3

我設置omniauth爲設計使用在其網站上的說明進行https://github.com/plataformatec/devise/wiki/OmniAuth:-Overview設計 - 合併OAuth的現有帳戶

我現在想讓它已經有一個帳戶,以透明地與自己的谷歌賬戶登錄的用戶:如果谷歌帳戶使用與之前註冊的用戶相同的電子郵件地址,則該網站應使用該帳戶登錄該用戶。

我只是在鏈接修改的建議代碼如下:

def self.from_omniauth(auth) 
    user = User.find_by(email: auth.info.email) 
    if user 
    user.skip_confirmation! 
    user.provider = auth.provider 
    user.uid = auth.uid 
    user.name = auth.info.name 
    return user 
    end 

    where(auth.slice(:provider, :uid)).first_or_create do |user| 
    user.skip_confirmation! 
    user.provider = auth.provider 
    user.uid = auth.uid 
    user.email = auth.info.email 
    user.password = Devise.friendly_token[0,20] 
    user.name = auth.info.name 
    end 
end 

它似乎做工精細,雖然我不知道如果這個代碼引入了,我不知道有任何風險。設計對我來說是一種黑盒子。

回答

6

只有在確認後才能鏈接帳戶。谷歌是一個電子郵件供應商,所以電子郵件已經被確認。但是,您並未檢查您的用戶帳戶是否已確認。

因此,如果我知道你的電子郵件,我可以在你的網站上註冊它,並等待你稍後用Google登錄。然後我可以訪問您的帳戶。

如果Devise's confirmed? method返回true,則應該只合並帳戶。

1

下面是我現在使用的代碼。快樂複製粘貼。

def self.from_omniauth(auth) 
    user = User.find_by(email: auth.info.email) 
    if user and user.confirmed? 
    user.provider = auth.provider 
    user.uid = auth.uid 
    return user 
    end 

    where(auth.slice(:provider, :uid)).first_or_create do |user| 
    user.skip_confirmation! 
    user.provider = auth.provider 
    user.uid = auth.uid 
    user.email = auth.info.email 
    user.password = Devise.friendly_token[0,20] 
    user.name = auth.info.name 
    end 
end