2016-04-13 45 views
0

Bir uygulama için Yetkilendirme sağlayıcıları (twitter, facebook, soundcloud) (raylarda ruby) uygulamıştım ancak yeni Kullanıcı hesaplarının oluşturulmaması için var olan kısıtlamayı uyguladım e-postaya dayanmaktadır, ancak bazı sağlayıcılar e-posta adresi sağlamamaktadır.Auth Sağlayıcıları nedeniyle aynı kullanıcıdan birden fazla hesap nasıl karşılanır

Aynı kullanıcı için birden fazla hesap oluşturmamak için iyi bir karşı önlem nedir?

user.model

class User < ActiveRecord::Base 

    has_many :usertracks, :dependent => :destroy 
    mount_uploader :image, ArtistPhotoUploader 

    TEMP_EMAIL_PREFIX = '[email protected]' 
    TEMP_EMAIL_REGEX = /\[email protected]/ 

    # Include default devise modules. Others available are: 
    # :lockable, :timeoutable 
    devise :database_authenticatable, :registerable, :confirmable, 
    :recoverable, :rememberable, :trackable, :validatable, :omniauthable 

    validates_format_of :email, :without => TEMP_EMAIL_REGEX, on: :update 

    validates_presence_of :image 
    validates_integrity_of :image 
    validates_processing_of :image 

    def self.find_for_oauth(auth, signed_in_resource = nil) 

    # Get the identity and user if they exist 
    identity = Identity.find_for_oauth(auth) 

    user = signed_in_resource ? signed_in_resource : identity.user 

    # Create the user if needed 
    if user.nil? 

    UsersController.finish_signup 
     email_is_verified = auth.info.email && (auth.info.verified || auth.info.verified_email) 
     email = auth.info.email if email_is_verified 
     user = User.where(:email => email).first if email 

     # Create the user if it's a new registration 
     if user.nil? 
     firstname = auth.info.name.split(' ')[0] 
     surname = auth.info.name.split(' ')[1] 
     user = User.new(
      firstname: firstname, 
      surname: surname, 
      #username: auth.info.nickname || auth.uid, 
      email: email ? email : "#{TEMP_EMAIL_PREFIX}-#{auth.uid}-#{auth.provider}.com", 
      password: Devise.friendly_token[0,20], 
      remote_image_url: auth.info.image.gsub('http://','https://') 
     ) 
     user.oauth_token = auth.credentials.token 
     user.oauth_secret = auth.credentials.secret 

     user.skip_confirmation! 
     user.save! 
     end 
    end 

    # Associate the identity with the user if needed 
    if identity.user != user 
     identity.user = user 
     identity.save! 
    end 
    user 
    end 

    def email_verified? 
    self.email && self.email !~ TEMP_EMAIL_REGEX 
    end 

end 

cevap

1

gerçekten tekrar kaydolma birisini tutmak için iyi bir yol yoktur. Bir sihirbaz değilsiniz ve birisinin nasıl giriş yapacağını/oturum açacağını tahmin edemezsiniz.

Zaten mantıksal bir şey yapıyorsunuz.

İlerlemenin en iyi yolu, birisinin 2 hesabı birleştirmesine izin vermesi ve daha sonra birden çok sağlayıcıyı birbirine bağlamalarına izin vermektir.

Birden fazla sağlayıcı ekleme kısmı kolaydır. Sadece mevcut olan her birini yetkilendirmek için tıklayabilecekleri bir profil içinde bir bağlantı verin.

Hesapların birleştirilmesi daha zor olabilir. User_id dosyasının saklandığı her yer (polimorfik çağrışımlar dahil) tutulan kullanıcı_kimliği yansıtacak şekilde güncellenmelidir. Diğer kullanıcı daha sonra silinmelidir.

+0

Benim durumumda oturum açmalarını ve oturum açtıktan sonra dosyayı indirdiklerini - oturum açtıkları yetkilendirme sağlayıcısına bağlı olarak indirmem gerekiyor. Bu nedenle, hesapların birleştirilmesi gerçekten işe yaramıyor. Daha büyük sorunum, hangi sağlayıcıyı o anda imzalandıkları ile bilmem gerektiğidir, böylece dosyayı indirmek için uygun bir paylaşım düğmesi (sağlayıcıya bağlı) sunabilirim. –

+0

aaah, zor bir mola. .. Sağlayıcının adını, geriçağırımın oturum açma kısmı sırasında bir oturum değişkenine kaydedebilirsiniz. oturum [: pvd] = "google", vb? – trh

+0

evet sanırım bu hatlar boyunca bir şeyler yapacağım. –