2016-04-13 10 views
0

gegensteuern kann Ich habe Auth-Provider (twitter, facebook, soundcloud) für eine App (Ruby on Rails) implementiert, aber die Einschränkung habe ich eingerichtet, so dass keine neuen Benutzerkonten erstellt werden basiert auf E-Mail, aber einige Anbieter bieten keine E-Mail-Adresse an.Wie man mehrere Konten desselben Benutzers wegen Auth Providers

Was ist eine gute Gegenmaßnahme, um die Erstellung mehrerer Konten für denselben Benutzer zu vermeiden?

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 

Antwort

1

Es ist wirklich kein guter Weg, um jemanden zu halten, von wieder anmeldest. Sie sind kein Magier und können nicht vorhersagen, wie sich jemand anmeldet/anmeldet.

Sie machen bereits die logische Sache.

Der beste Weg, um voranzukommen, ist es, jemandem zu erlauben, 2 Konten zusammenzuführen und dann zu erlauben, dass sie mehrere Anbieter verbinden.

Das Hinzufügen mehrerer Anbieter Teil ist einfach. Geben Sie einfach einen Link in einem Profil an, in dem sie klicken können, um jeden verfügbaren zu autorisieren.

Das Zusammenführen von Konten kann komplizierter sein. Jeder Ort, an dem user_id gespeichert wird (einschließlich polymorpher Assoziationen), muss aktualisiert werden, um die beibehaltene user_id wiederzugeben. Der andere Benutzer sollte danach gelöscht werden.

+0

hmm in meinem Fall, ich brauche sie, um sich anzumelden, und laden Sie die Datei nach dem Teilen - abhängig von der Auth-Provider sie angemeldet. So Konten zusammenführen, ist hier nicht wirklich hilfreich, aber es ist eine gute Gesamt-Zugabe. Mein größeres Problem ist, dass ich wissen muss, mit welchem ​​Anbieter sie zu der Zeit angemeldet sind, so dass ich sie mit einem geeigneten Share-Button (Provider abhängig) präsentieren kann, um die Datei herunterzuladen. –

+0

aaah, harte Pause. .. Ich nehme an, Sie könnten den Provider-Namen während des Anmeldeabschnitts des Rückrufs in einer Sitzungsvariablen speichern. Sitzung [: pvd] = "Google", etc? – trh

+0

Ja ich denke ich werde etwas in diese Richtung tun, danke. –

Verwandte Themen