Sessions: Cross-Webserver-Sitzung

Erstellt am 24. Juli 2016  ·  11Kommentare  ·  Quelle: gorilla/sessions

Ist es möglich, eine serverübergreifende Sitzung mit Gorilla/Sessions zu machen? Angenommen, ich habe mehrere Server, um eine Website zu bedienen. Wenn sich der Benutzer auf einem Server anmeldet, erwarte ich, dass er sich auch auf einem anderen Server anmeldet.

question

Hilfreichster Kommentar

@CasperHK Das bekommen Sie standardmäßig mit Cookies: Solange Server alle Teil derselben Domain sind (zB github.com oder *.github.com), wird das Cookie vom Browser gesendet.

Alternativ unterstützen Sessions auch serverseitige Stores – alle Server müssten sich mit diesem Store verbinden können (sei es Redis oder PostgreSQL usw.).

Alle 11 Kommentare

@CasperHK Das bekommen Sie standardmäßig mit Cookies: Solange Server alle Teil derselben Domain sind (zB github.com oder *.github.com), wird das Cookie vom Browser gesendet.

Alternativ unterstützen Sessions auch serverseitige Stores – alle Server müssten sich mit diesem Store verbinden können (sei es Redis oder PostgreSQL usw.).

gorilla/session scheint gut für meine Aufgabe zu sein. Eigentlich möchte ich Go für mein Abschlussprojekt an meiner Universität verwenden und habe jetzt 12 Ubuntu-Server unter derselben Domäne. Einige davon werden als Webserver und einer als MySQL-Datenbankserver verwendet. Daher möchte ich einen MySQL-basierten Sitzungsdienst implementieren, um die Synchronisation von Sitzungsdaten auf allen Webservern zu ermöglichen.
Zuvor habe ich versucht, die MySQL-basierte Cross-Server-Sitzung zu programmieren. Wenn srinathgs/mysqlstore eine einfachere Möglichkeit bietet, dasselbe zu tun, ist es großartig für mich, zu lernen und meine Arbeit zu vereinfachen.

Verwenden Sie den Standard-CookieStore, und wenn alle Server denselben Signaturschlüssel haben,
und in derselben Domäne existieren, funktioniert es wie es ist.

Am Sonntag, 24. Juli 2016 um 22:48 Uhr schrieb Casper LI [email protected] :

Gorilla/Session scheint für meine Aufgabe großartig zu sein. Eigentlich möchte ich Go auf meinem verwenden
Abschlussprojekt an meiner Universität und jetzt habe ich 12 Ubuntu-Server unter
die gleiche Domäne. Einige von ihnen werden als Webserver verwendet und einer wird
als MySQL-Datenbankserver verwendet. Daher möchte ich a . implementieren
MySQL-basierter Sitzungsdienst zur Synchronisierung von Sitzungsdaten in allen Web
Server.
Zuvor habe ich versucht, die MySQL-basierte Cross-Server-Sitzung zu programmieren. Ob "
github.com/gorilla/sessions" bieten eine einfachere Möglichkeit, dasselbe zu tun, es ist
großartig für mich, um zu lernen und meine Arbeit zu vereinfachen.


Sie erhalten dies, weil Sie zugewiesen wurden.

Antworten Sie direkt auf diese E-Mail und zeigen Sie sie auf GitHub an
https://github.com/gorilla/sessions/issues/87#issuecomment -234845955,
oder den Thread stumm schalten
https://github.com/notifications/unsubscribe-auth/AABIcNfC7H8DrZq5NX1Tu7W_Vd1LM5BIks5qZE43gaJpZM4JTizF
.

Entschuldigung, ich möchte fragen, was der Standard-CookieStore und der Signaturschlüssel sind. CookieStore bedeutet gorilla/sessions Paket?

Jawohl. Werfen Sie einen Blick auf http://www.gorillatoolkit.org/pkg/sessions -

  • something-very-secret ist der Signaturschlüssel
  • sessions.NewCookieStore gibt ein *CookieStore , das keine Datenbank/gemeinsamen Status zwischen Ihren Servern erfordert.
import (
    "net/http"
    "github.com/gorilla/sessions"
)

var store = sessions.NewCookieStore([]byte("something-very-secret"))

func MyHandler(w http.ResponseWriter, r *http.Request) {
    // Get a session. We're ignoring the error resulted from decoding an
    // existing session: Get() always returns a session, even if empty.
    session, err := store.Get(r, "session-name")
    if err != nil {
        http.Error(w, err.Error(), http.StatusInternalServerError)
        return
    }

    // Set some session values.
    session.Values["foo"] = "bar"
    session.Values[42] = 43
    // Save it before we write to the response/return from the handler.
    session.Save(r, w)
}

Ich habe den Code gelesen. Wenn ich ansehe

var store = sessions.NewCookieStore([]byte("something-very-secret")) 

Ich frage mich, ob die Variable store in allen Handlern im gesamten Projekt verwendet wird. Wenn ja, muss ich es anscheinend in ein anderes Paket packen und exportieren. Dies liegt daran, dass ich alle verschiedenen Handler in verschiedene Pakete getrennt habe, je nachdem, welche Seite sie bedienen (zB index , projbrwsr , codeeditor ) und diese Handler die gleich Store .
image

something-very-secret soll ein geheimer Schlüssel sein, aber ich habe keine Ahnung, was ich an die Funktion NewCookieStore() .

Fügen Sie Store (sessions.Store) als Abhängigkeit in Ihre anderen Pakete ein.

Am Montag, 25. Juli 2016 um 8:57 Uhr schrieb Casper LI [email protected] :

Ich habe den Code gelesen. Wenn ich ansehe

var store = session.NewCookieStore([]byte("etwas-sehr-geheimes"))

Ich frage mich, ob die Store-Variable durchgängig in allen Handlern verwendet wird
das Projekt. Wenn ja, muss ich es anscheinend in ein anderes Paket packen und
exportieren lassen. Dies liegt daran, dass ich alle verschiedenen Handler in getrennt habe
verschiedene Pakete, je nachdem, welche Seite sie bedienen (z. B. Index,
projbrwsr, codeeditor) und diese Handler müssen denselben Store aufrufen.
[Bild: Bild]
https://cloud.githubusercontent.com/assets/6957401/17107410/a34dcc50-52c1-11e6-92f7-a4227da60244.png


Sie erhalten dies, weil Sie zugewiesen wurden.

Antworten Sie direkt auf diese E-Mail und zeigen Sie sie auf GitHub an
https://github.com/gorilla/sessions/issues/87#issuecomment -234996994,
oder den Thread stumm schalten
https://github.com/notifications/unsubscribe-auth/AABIcOHzeq8IabUoj-SZx_B-7er-PJf9ks5qZNzsgaJpZM4JTizF
.

Etwas-sehr-Geheimnis soll ein geheimer Schlüssel sein, aber ich habe keine Ahnung, was ich an die Funktion NewCookieStore() übergeben soll.

https://godoc.org/github.com/gorilla/sessions#NewCookieStore

Schlüssel werden paarweise definiert, um eine Schlüsselrotation zu ermöglichen, aber der übliche Fall besteht darin, einen einzelnen Authentifizierungsschlüssel und optional einen Verschlüsselungsschlüssel festzulegen.
Der erste Schlüssel eines Paares wird zur Authentifizierung und der zweite zur Verschlüsselung verwendet. Der Verschlüsselungsschlüssel kann im letzten Paar auf null gesetzt oder weggelassen werden, aber der Authentifizierungsschlüssel ist in allen Paaren erforderlich.

NewCookieStore benötigt einen Authentifizierungs-/Signaturschlüssel und einen (optionalen) Verschlüsselungsschlüssel.

Tut mir leid, ich bin ziemlich neu bei Go. Könnten Sie mehr über Inject store erklären oder mir einen Link zur Erklärung geben? Danke.

@CasperHK Lassen Sie die Konstruktoren Ihrer Pakete ihre Abhängigkeiten akzeptieren - zB

  • NewProjectBrowser(store sessions.Store, debug bool) (*ProjectBrowser, error) { ... }
  • NewCodeEditor(store sessions.Store) (*CodeEditor, error) { ... }

In main.go

func main() {
    // Create a store, and then pass it (inject it) into your other packages via their constructors
    store  := sessions.NewCookieStore(key)
    ...
    ce, err := package.NewCodeEditor(store)
    ...
    pb, err := package.NewProjectBrowser(store)
    ...
}

Schließung wegen Inaktivität.

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen