Sessioner är ett populärt alternativ för användarautentisering på webben. En session är en period under vilken en användare aktivt engagerar sig i en applikation. En sessions livslängd börjar när en användare loggar in och slutar när de loggar ut.

HTTP är ett tillståndslöst protokoll, så du måste ofta spåra användaraktivitet manuellt.

På serversidan av din applikation kan du generera ett unikt värde, gärna ett kryptografiskt säkert. Du kan sedan lagra det i en cookie som kunden kommer att skicka till din app vid framtida förfrågningar, vilket skapar en form av tillstånd.

Sessioner i Go

Du kan använda net/http-paketet för att implementera sessioner, och det finns många tillgängliga paket som redan gör detta. Det mest populära är Gorilla-sessionspaketet. Detta paket tillhandahåller cookie- och fillagringsfunktionalitet tillsammans med anpassad sessionsbackend-infrastruktur.

Kör det här kommandot på din Go-arbetsyta för att installera Gorilla-sessionspaketet.

 hämta github.com/gorilla/sessions
instagram viewer

I den här handledningen kommer du att använda en cookie-butik för sessioner. Du kommer att använda net/http-paketet för att starta en webbserver som kontrollerar användarens problem och återkallar sessioner.

Här är listan över importer du behöver för att följa denna handledning.

importera (
"github.com/gorilla/sessions"
"logga"
"net/http"
)

De logga paketet är för loggningsrelaterade operationer baserat på statusen för användarens autentisering.

En enkel implementering av Cookie Store

Du behöver en cookie-butik för dina inloggnings- och utloggningshanterare. För din cookiebutik behöver du en hemlig nyckel för autentisering.

Här är en funktion för implementeringen av cookiebutiken.

// cookieStore-funktionen skapar en cookie-butik med användarens hemliga nyckel
funccookieStore() *sessioner.CookieStore {
SecretKey := []byte("superhemlig-SecretKey")
cookieStore := sessioner. NewCookieStore (SecretKey)

//-funktionen returnerar cookie-arkivet så att andra funktioner kan komma åt det
lämna tillbaka cookieStore
}

I den cookieStore funktion, den deklarerade hemliga nyckelvariabeln Hemlig nyckel är ett exempel på en hemlig nyckel. I produktionen bör din hemliga nyckel vara kryptografiskt säker, med till exempel kryptopaketet. Du bör också ladda hemligheten från en fil med miljövariabler.

Funktionen returnerar ett värde av *sessioner. CookieStore typ som representerar cookie-lagringen säkrad med den hemliga nyckeln. Du kommer att använda CookieStore funktion i din logga in och logga ut hanterare för att autentisera användare och tilldela sessioner.

Inloggningshanterarens funktion

Du vill verifiera om användaren redan är inloggad innan du skapar en session i din inloggningshanterarfunktion. Du kan använda Skaffa sig metod på cookie-arkivet för att hämta en session från cookien och lägga till sessionen till kundens begäran.

De Skaffa sig metod returnerar sessionen och ett fel som du kan hantera. Om du behöver autentisera användaren kan du autentisera eller auktorisera i logga in hanterare.

// inloggningshanteraren hämtar sessionen från cookie Store
funclogga in(författare http. ResponseWriter, begär *http. Begäran) {
session, err := cookieStore().Get (request, "Cookie Name From Request")

om fel!= noll {
logga. Fatalln (fel)
}

// ställ in din användarverifiering här baserat på operationen
session. Värden["auth status"] = Sann
err = session. Spara (begäran, skribent)

om fel!= noll {
lämna tillbaka
}
}

Egenskapen Values ​​innehåller sessionsrelaterade data i cookie-arkivet:

De Spara metoden sparar sessionen i cookie-butiken. I dina hanterare behöver du andra autentiseringsåtgärder för högre säkerhet.

Verifiera en användares inloggningsstatus

Din verifieringshanterare bör hämta sessionen från kundens cookie med hjälp av cookie-butikens Skaffa sig metod. Sedan kan du hämta sessionen och autentisera användaren.

funccheckAuthStatus(författare http. ResponseWriter, begär *http. Begäran) {
session, err := cookieStore().Get (request, "Cookie Name From Request")

om fel!= noll {
logga. Fatalln (fel)
}

autentiserad := session. Värden["auth status"]

om autentiserat == Sann {
författare. WriteHeader (http. StatusOK) // skriv 200 statuskod
lämna tillbaka
} annan {
författare. WriteHeader (http. StatusBadRequest) // skriv 400 http statuskod
lämna tillbaka
}
}

De autentiserade variabeln använder Värderingar egendom för att hämta status från cookie-butiken. If-satsen verifierar sedan denna autentiseringsstatus. Om det utvärderar till Sann, kunden får 200 HTTP-statuskod. Om autentiseringsstatusen inte är sann, får klienten 400 HTTP-statuskoden.

Sessionsutloggningshanteraren

Din utloggningshanterarfunktion kommer att vara mycket lik inloggningshanterarens funktion. Du kommer att radera all data relaterad till användarens session från cookie-butiken och annullera autentiseringsstatusen.

funclogga ut(författare http. ResponseWriter, begär *http. Begäran) {
session, err := cookieStore().Get (request, "Cookie Name From Request")

om fel!= noll {
lämna tillbaka
}

// ogiltigförklara användarens session från cookiebutiken
session. Värden["auth status"] = falsk
err = session. Spara (begäran, skribent)

om fel!= noll {
lämna tillbaka
}
}

De logga ut hanterarfunktionen upphäver användarens sessionsautentiseringsstatus och sparar statusen i cookie-arkivet.

Lagra inte känsliga data i sessioner

Sessioner är bra för att lagra data, men det är bäst att undvika att lagra känslig data i dem. En angripare kan kapa en session om du lagrar dess data i en cookie och skickar den över vanlig HTTP. Säkerheten för din app är viktig för dina användare.

Sessioner är stateful och det finns många databasimplementationer av cookie-butiker för Gorilla-paketet, för både SQL- och NoSQL-databaser.