2013-09-06 4 views
34

Ich benutze devise gem, nach dem Klicken auf den Bestätigungslink, möchte ich direkt anmelden. Zurzeit wird darum gebeten, sich erneut anzumelden.Anmeldungen nach der Bestätigung vermeiden Link klicken, um den Edelstein zu verwenden?

Irgendwelche Vorschläge
config.allow_insecure_token_lookup = true 
config.secret_key = 'a8d814803c0bcc735ce657adc77793459d00154cdd7532c13d3489600dc4e963f86e14beb593a32cbe9dbbe9197c9ce50a30102f363d90350052dc8d69930033' 

:

Vor kurzem habe ich folgendes in der devise initialisieren Datei hinzugefügt?

+0

Hat Ihr Bestätigungslink ein 'access token'? –

+1

ja, beispiel link: http: // localhost: 3000/benutzer/bestätigung? Confirmation_token = ede7fbc3203644c0ff40cf31844389d460607a09d5f13ce95bcddd25c8fce667 –

Antwort

54

In früheren Versionen von Devise wurde der Benutzer nach der Bestätigung automatisch angemeldet. Dies bedeutete, dass jeder, der auf die Bestätigungs-E-Mail zugreifen konnte, sich durch Klicken auf den Link in das Konto eines anderen Benutzers einloggen konnte.

Das automatische Signieren des Benutzers kann auch beim E-Mail-Bestätigungsworkflow schädlich sein. Stellen Sie sich vor, ein Benutzer entscheidet sich, seine E-Mail-Adresse zu ändern, und macht dabei einen Tippfehler auf die neue E-Mail-Adresse. Eine E-Mail wird an eine andere Adresse gesendet, die sich mit dem Token in der Hand in diesem Konto anmelden kann.

Wenn der Benutzer die E-Mail sofort korrigiert, wird kein Schaden angerichtet. Aber wenn nicht, könnte sich jemand anderes in diesem Konto anmelden und der Benutzer würde nicht wissen, dass es passiert ist.

Aus diesem Grund signiert Devise 3.1 den Benutzer nicht mehr automatisch nach der Bestätigung. Sie können vorübergehend das alte Verhalten nach der Aktualisierung bringen durch die folgende in Ihrer config/initializers/devise.rb Einstellung:

config.allow_insecure_sign_in_after_confirmation = true

Diese Option ist nur verfügbar sein wird vorübergehend Migration zu unterstützen.

+1

Es funktioniert gut. Vielen Dank Rajarshi Das! Tolle Hilfe. –

+1

Ich wurde verrückt durch Devise Source graben und konnte nicht finden, wo es Benutzer nach der Bestätigung anmelden. Und es ist nicht, danke, dass du das klar gemacht hast! – Mirko

+1

Wenn Sie auf das E-Mail-Konto des Benutzers zugreifen können, können Sie sein Passwort trotzdem zurücksetzen, daher verstehe ich das Sicherheitsproblem hier nicht. Gleiches für das zweite Beispiel, wenn Sie die E-Mail erhalten, um die Änderung der E-Mail-Adresse zu bestätigen, können Sie das Passwort nach dem gleichen Problem ändern. – Jean

51

Das Flag config.allow_insecure_sign_in_after_confirmation wird in Devise nicht mehr unterstützt.

Während Sie sich der möglichen Sicherheitsbedenken bewusst sein sollten, wenn Sie Benutzer automatisch anmelden, wenn sie ihr Konto bestätigen (http://blog.plataformatec.com.br/2013/08/devise-3-1-now-with-more-secure-defaults/), kann der Vorteil in Bezug auf die Benutzerfreundlichkeit den Sicherheitsabwägung wert sein.

Schließlich besteht das Sicherheitsrisiko darin, dass a) der Benutzer seine E-Mail falsch eingibt, b) sie ihren Fehler nicht sofort korrigiert, c) die von ihnen eingegebene E-Mail einer gültigen und funktionierenden E-Mail entspricht; Person, die die E-Mail falsch empfängt, öffnet sie und klickt auf den Link.

Wenn dies ein akzeptables Risikoprofil für Ihre Anwendung ist, können Sie die devise ConfirmationsController außer Kraft setzen:

class ConfirmationsController < Devise::ConfirmationsController 
    def show 
    self.resource = resource_class.confirm_by_token(params[:confirmation_token]) 
    yield resource if block_given? 

    if resource.errors.empty? 
     set_flash_message(:notice, :confirmed) if is_flashing_format? 
     sign_in(resource) # <= THIS LINE ADDED 
     respond_with_navigational(resource){ redirect_to after_confirmation_path_for(resource_name, resource) } 
    else 
     respond_with_navigational(resource.errors, :status => :unprocessable_entity){ render :new } 
    end 
    end 
end 

Und Weg, um es in Ihrem routes.rb:

devise_for :users, controllers: { confirmations: 'confirmations' } 
+0

Warum kann man nicht etwas tun, um zu erkennen, dass die Maschine, auf der die Verbindung erreicht wird, dieselbe Maschine ist, die die E-Mail gesendet hat? Zum Beispiel etwas in einem Cookie speichern. Wenn die Maschine übereinstimmt, melden Sie sich automatisch an und wenn nicht, müssen Sie sich anmelden. – brooks

+0

Gut gemacht @LouisSimoneau! – josethernandezc

+3

Wenn Sie dies tun, ist es wert, die 'de: devise: confirmations: confirmed' Zeichenfolge in' config/locales/devise.en.yml' zu ändern, um zu sagen, dass Sie sie auch eingeloggt haben ... –

15

Bei neueren Versionen von Devise können Sie Folgendes tun.

config/routes.rb:

devise_for :users, controllers: { confirmations: 'users/confirmations' } 

app/controllers/users/confirmations_controller. rb:

class Users::ConfirmationsController < Devise::ConfirmationsController 
    def show 
    super do |resource| 
     sign_in(resource) 
    end 
    end 
end 
+0

Ich bin ziemlich sicher, dass dies nicht wirklich funktionieren wird wie vorgesehen: der 'yield' Aufruf in Devices ConfirmationsController passiert _weder oder nicht_ die Ressource hat Fehler, so denke ich, dass dies Sie auch ohne die richtige Bestätigung anmelden würde Zeichen (!!!). –

+2

Ja, das wird sich anmelden, unabhängig davon, ob das Token gültig ist oder nicht. Aber Sie können das beheben, indem Sie die sign_in-Zeile in 'sign_in (resource) if resource.errors.empty ändern?' – scottwb

+0

Tatsächlich wird der Benutzer nicht signiert, ob das Token gültig ist oder nicht. Es ergibt zwar die Ressource, aber alle Felder sind null (weil 'Devise' den 'Benutzer' mit dem zugehörigen Token nicht finden kann). Sie werden also (standardmäßig) zum sign_in-Pfad weitergeleitet mit der Nachricht, dass Sie Ihr Konto bestätigen müssen. Nun, wenn ich das gesagt habe, denke ich, dass das Hinzufügen von 'if resource.errors.empty?' Schön Absicht ist, aber es ist unnötig. –

1

Wir wollten so dass der Benutzer automatisch anmelden, wenn sie den Link in der E-Mail 2 Stunden oder weniger nach Benutzererstellung klickt. Basierend auf @ Sjor Antwort, gingen wir mit:

class ConfirmationsController < Devise::ConfirmationsController 
    def show 
    super do |resource| 
     if resource.confirmed_at > DateTime.now-2.hours && resource.errors.empty? 
     sign_in(resource) 
     end 
    end 
    end 
end 
3

Mit Blick auf MB21 Antwort, sollte es

sein
def show 
    super do |resource| 
    if resource.confirmation_sent_at > DateTime.now-2.hours && resource.errors.empty? 
     sign_in(resource) 
    end 
    end 
end 

confirmation_sent_at die Zeit ist, wurde die E-Mail an den Benutzer gesendet, wie, confirmed_at gegenüber, die Ist der Moment, in dem der Benutzer auf den Link klickt, der immer innerhalb von 2 Stunden auf dem Server ist, wenn es passiert ...

Verwandte Themen