Sie werden etwas Sicherheit opfern, indem Sie dies tun, aber es ist definitiv möglich. Es gibt zwei Möglichkeiten, wie Sie dies erreichen können.
In der ersten können Sie die Methode make_token in Ihrem Benutzermodell überschreiben. Das Modell wird derzeit wie folgt implementiert.
def make_token
secure_digest(Time.now, (1..10).map{ rand.to_s })
end
Jedes Mal, wenn ein Benutzer anmeldet, mit oder ohne Cookies wird die make_token
Methode, die ein neues remember_token
für den Benutzer erzeugt genannt und speichert. Wenn Sie einen anderen Wert für den Benutzer hatten, der nicht erraten werden konnte, können Sie die -Methode ersetzen.
Dies würde sicherstellen, dass sich das Token nie ändert, aber es würde auch jeden aktivieren, der das Token erhalten hat, um sich als Benutzer auszugeben.
Wenn Sie einen Blick auf die handle_remember_cookie!
-Methode in der Datei authenticated_system.rb
werfen, sollten Sie in der Lage sein, diese Methode für Sie zu ändern.
def handle_remember_cookie!(new_cookie_flag)
return unless @current_<%= file_name %>
case
when valid_remember_cookie? then @current_<%= file_name %>.refresh_token # keeping same expiry date
when new_cookie_flag then @current_<%= file_name %>.remember_me
else @current_<%= file_name %>.forget_me
end
send_remember_cookie!
end
Sie werden bemerken, dass diese Methode drei Methoden im Benutzermodell nennt, refresh_token
, remember_me
und forget_me
.
def remember_me
remember_me_for 2.weeks
end
def remember_me_for(time)
remember_me_until time.from_now.utc
end
def remember_me_until(time)
self.remember_token_expires_at = time
self.remember_token = self.class.make_token
save(false)
end
#
# Deletes the server-side record of the authentication token. The
# client-side (browser cookie) and server-side (this remember_token) must
# always be deleted together.
#
def forget_me
self.remember_token_expires_at = nil
self.remember_token = nil
save(false)
end
# refresh token (keeping same expires_at) if it exists
def refresh_token
if remember_token?
self.remember_token = self.class.make_token
save(false)
end
end
Alle drei dieser Methoden setzen das Token zurück. forget_me
setzt es auf nil
, während die anderen beiden es auf den von make_token
zurückgegebenen Wert setzen. Sie können diese Methoden im Benutzermodell überschreiben, um zu verhindern, dass sie das Token zurücksetzen, wenn es existiert und nicht abgelaufen ist. Das ist wahrscheinlich der beste Ansatz, oder Sie könnten der handle_remember_cookie!
-Methode zusätzliche Logik hinzufügen, obwohl das wahrscheinlich mehr Arbeit wäre.
Wenn ich Sie wäre, würde ich remember_me_until
, forget_me
und refresh_token
im Benutzermodell außer Kraft setzen. Folgendes sollte funktionieren.
Beachten Sie, dass Sie dadurch die Funktionen entfernen, die Sie vor Token-Diebstahl schützen. Aber das ist eine Kosten-Nutzen-Entscheidung, die Sie treffen können.
Vielen Dank! Wie funktioniert nun die Funktionalität eines Benutzers, der "Remember me" überprüft? Erinnert sie sich noch an die Zeit, die in der Methode 'remember_me' festgelegt wurde? – Shpigford
Sie merkt sich diese noch 2 Wochen, wie in der Methode remember_me, aber diese 2 Wochen beginnen mit der ersten Verwendung des Tokens. Mit anderen Worten: Wenn Sie sich von Computer A aus anmelden und sich 10 Tage von Computer B anmelden, läuft der Token 4 Tage später auf beiden Computern ab. – jcnnghm
Großartig. Danke nochmal für deine Hilfe! – Shpigford