2016-01-03 11 views
8

Zuerst wählte ich put_session, um Benutzer-ID zu speichern, da Sitzungshash nicht manipuliert werden kann. Es scheint jedoch so zu sein, dass Sitzungscookies nur während der Browsersitzung bestehen bleiben. Wenn der Benutzer den Browser erneut öffnet, ist er verschwunden und der Benutzer muss sich erneut anmelden.Implementieren von remember-me in Phoenix

Ich lese, dass eine andere Option sein könnte, ein sicheres zufälliges Token für jeden Benutzer zu generieren und es in der Datenbank zu speichern und es in ein reguläres Cookie mit hohem Ablaufdatum zu setzen. Da jedoch dieser Cookie keinen Manipulationsschutz AFAIK hat (aber ich könnte falsch liegen) und die Verbindung nicht immer https ist, denke ich, dass jeder, der http in der Mitte zwischen dem Benutzer und dem Server hört, in der Lage wäre, die Benutzersitzung zu entführen .

Daher ist die Frage, wie kann ich Benutzer-ID in Sitzung auf eine sichere Weise persistieren? Oder was sind die anderen Möglichkeiten?

+7

Ich kann keine detaillierte Antwort geben, aber ich kann die richtigen Anweisungen geben. Sie können 'Phoenix.Token' (http://hexdocs.pm/phoenix/Phoenix.Token.html) verwenden, um ein Token zu generieren, das Sie als Cookie mit' put_resp_cookie' (http://hexdocs.pm) speichern /plug/Plug.Conn.html#put_resp_cookie/4). Sobald eine Anfrage vorliegt und der Benutzer nicht angemeldet ist, verwenden Sie 'conn.cookies [" remember_me "]', um zu sehen, ob ein Erinnerungs-Cookie mit dem Token verfügbar ist, und versuchen Sie, es zu bestätigen. –

+1

Danke für die Erklärung, scheint wie Phoenix.Token passt perfekt für diese Situation! – ave

Antwort

6

Der Standard-Cookie "max-age" ist bis nahe browwser. Sie sollten dem Cookie einen wirklich hohen "max_age" Wert geben: http://hexdocs.pm/plug/Plug.Conn.html#put_resp_cookie/4


Einen anderen Weg, set "max_age", ich kann es nicht in official doc finden, aber es funktioniert:

defmodule HelloPhoenix.Endpoint do 
    use Phoenix.Endpoint, otp_app: :hello_phoenix 
. . . 
    plug Plug.Session, 
    store: :cookie, 
    key: "_hello_phoenix_key", 
    signing_salt: "Jk7pxAMf", 
    max_age: 2592000 # 60*60*24*30 
. . . 
end 
1

Ich implementiere "Remember me" auf meiner Website. Mit Phoenix.Token kann der Cookie von Clients gelesen werden. Also benutze ich MessageEncryptor (https://github.com/elixir-lang/plug/blob/master/lib/plug/crypto/message_encryptor.ex) um das Ticket zu verschlüsseln und zu signieren. Dann benutze ich put_resp_cookie mit einem hohen Max-Alter, um das verschlüsselte Ticket zum Cookie zu machen. Bitte beachten Sie, dass IE Max-Age nicht unterstützt, so dass "Remember me" nicht auf IE funktioniert.