2016-04-28 3 views
6

Ich benutze Rails 4.2.5 mit dem Juwel "Omniauth-google-oauth2". In meiner Anwendung können Nutzer sich nur über ihre Google- oder Facebook-Logins anmelden. Was ich möchte ist, meine Anwendung mit einem ersten Benutzer, mir (email = '[email protected] "), mit der Administratorrolle vorzubelegen. Es wäre schön, dies programmatisch zu tun, so dass ich denselben Code verwenden kann, wenn ich dies in andere Umgebungen einbringe.Wie befülle ich meine Rails 4-Anwendung mit einem Google-Nutzer?

Meine Rollen Tabelle (durch db/seeds.rb) hat die Rollen

Admin 
User 

und meine app/Modell/user.rb Datei hat

def self.from_omniauth(auth) 
    where(auth.slice(:provider, :uid)).first_or_initialize.tap do |user| 
    user.provider = auth.provider 
    user.uid = auth.uid 
    user.name = auth.info.name 
    user.oauth_token = auth.credentials.token 
    user.oauth_expires_at = Time.at(auth.credentials.expires_at) 
    user.save! 
    end 
end 

Ich bin nicht sicher, wie man tun, was ich will, und würde daher einen Ratschlag wertschätzen.

Antwort

2

Nehmen wir jetzt an, Sie haben Ihr Google uid. Erstellen Sie einfach einen Benutzer aus Ihrem Samen, zum Beispiel:

user = User.new(
    provider: "google", 
    uid: "your-google-id", 
    email: "[email protected]", 
    name: "Your name" 
) 
user.roles << admin_role # Replace this line with your role assignment 
user.save # Perhaps use save(validate: false) if there're validations for other fields 

Damit, wenn Sie mit Google einzuloggen, sollte die omniauth Logik der Lage sein, den Samen Benutzer zu finden, was bedeutet, dass Sie als Administrator handeln werden in der Lage .

Bitte beachten Sie, dass Sie davon ausgehen, dass Sie das Google oauth token nicht für weitere Operationen benötigen, da Sie diese nicht gespeichert haben und von Ihrem from_omniauth nicht speichern, wenn der Benutzerdatensatz bereits existiert.

P.S. Von Ihrem Beispielcode aus wird Oauth info direkt in User Modell (provider und uid) gespeichert. Damit befürchte ich, dass sich ein Nutzer nicht gleichzeitig mit Facebook und Google anmelden kann, da beide in diesen beiden Bereichen speichern möchten.

Update: Einfügen ein Modell von meiner Code-Basis, die ein separates Modell von User ist die Login mehrerer Anbieter ermöglicht. Natürlich muss der Controller aktualisiert werden, um Authorization anstelle von User zu verwenden. Nur für den Fall, dass es hilft.

class Authorization < ActiveRecord::Base 
    belongs_to :user 

    def self.from_omniauth(auth) 
    authorization = where(auth.slice(:provider, :uid)).first_or_create 
    return authorization if authorization.user 

    if user = User.where(email: auth.info.email).first 
     authorization.bind_user(user) 
    else 
     user = authorization.create_user(auth.info) 
    end 

    authorization 
    end 

    def bind_user(user) 
    self.user = user 
    save 
    end 

    def create_user(info) 
    user = User.new(
     email:  info.email, 
     password: Devise.friendly_token[0, 20], 
     first_name: info.first_name, 
     last_name: info.last_name, 
    ) 
    user.save(validate: false) 

    bind_user(user) 

    user 
    end 
end 
+0

Hallo, das ist in Ordnung, wenn ein Benutzer nicht gleichzeitig in Google und Facebook und in meiner App eingeloggt sein kann. Ich bin verwirrt darüber, warum Sie das self.from_omniauth vom Benutzermodell in das Autorisierungsmodell verschoben haben.Werden so doppelte Benutzer nicht erstellt, wenn meine Datenbank bereits einen Benutzer enthält, der mit dem Provider und der Benutzerkennung übereinstimmt? – Dave

+0

@Dave Ja, der Zweck des Autorisierungsmodells besteht darin, mehrere Anbieter für denselben Benutzer zu unterstützen. Ohne diesen (aus Ihrem Code) wird ein Benutzer zweimal erstellt, wenn er sich bei Facebook und Google anmeldet. Es ist kein großes Problem, aber wenn Sie auch E-Mails vom Provider abrufen und diese in der Benutzer-Tabelle speichern, während Sie E-Mails als Login-ID haben, führt dies ebenfalls zu Problemen. –

1

Sie müssen eine Anfrage durch Ihren Controller über Ihre seed.rb-Datei ausführen, um den OAuth2-Prozess auszuführen.

Da Sie höchstwahrscheinlich Anmeldeinformationen eingeben oder Ihr Google-Konto über eine GUI auswählen müssen, empfehle ich, einen Systembefehl in Ihrer Datei seed.rb auszuführen, der einen Browser für die URL Ihrer Autorisierungsaktion öffnet.

# Mac: 
system("open <url_to_authorize_action>") 

Wenn dieser serialisiert werden soll, unmittelbar nach, eine while-Schleife hinzufügen, dass die DB all N Zeitschwelle überprüft, ob der Benutzer autorisiert ist.

while <user_not_authorized> do 
    sleep <N seconds> 
end 

Sie könnten dies zu mehreren Entwicklungsumgebungen rollen, aber offensichtlich nicht Produktion.

+0

Ich möchte etwas automatisieren, das keine Benutzerinteraktion erfordert, außer dem Ausführen einer Datei vielleicht. Cna ich nutze die Tatsache, dass ich meine Google ID im Voraus kenne? – Dave

Verwandte Themen