12 Stimmen

In einer Sinatra-App auf Heroku wird die Sitzung nicht über alle Dynos hinweg geteilt

Das macht Sinn. Aber was sind einige bevorzugte Workarounds für dieses Problem?

24voto

matt Punkte 76615

In meinem Kommentar schlug ich die Verwendung von Rack-Cookie-basierte Sitzungen aber wenn man es genau betrachtet, sind die Sinatra-Sessions son Rack-Cookie-Sitzungen sowieso.

Wenn ich weiter schaue, sehe ich dies in den Sinatra-Dokumenten gefunden :

Um die Sicherheit zu erhöhen, werden die Sitzungsdaten im Cookie mit einem Sitzungsgeheimnis signiert. Ein zufälliges Geheimnis wird von Sinatra für Sie generiert. Da sich dieses Geheimnis jedoch bei jedem Start Ihrer Anwendung ändert, sollten Sie das Geheimnis selbst festlegen, damit alle Ihre Anwendungsinstanzen es gemeinsam nutzen:

set :session_secret, 'super secret'

Es scheint also, dass jedes Heroku-Dyno einen anderen Schlüssel generiert und daher die Sitzungscookies der anderen nicht lesen kann, und Sie müssen einen Schlüssel angeben, damit jedes Dyno denselben verwendet.

Anstatt einen geheimen Schlüssel zu Ihrem Quellcode hinzuzufügen, ist es wahrscheinlich besser, ein Umgebungsvariable :

$ heroku config:add SESSION_KEY=a_longish_secret_key

Dann in Ihrer Sinatra-App:

enable :sessions
set :session_secret, ENV['SESSION_KEY']

1voto

Tom Andersen Punkte 6956

Aus Leistungs- oder Sicherheitsgründen können Sie auch eine Memcached-Sitzung verwenden. Habe es nicht ausprobiert, sah aber einfach aus. 5MB frei auf heroku.

0voto

Shubham Gupta Punkte 61
# In your app.rb file just add following - 
enable :sessions
set :session_secret, "some_random_value"

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X