Les sessions sont une option populaire pour l'authentification des utilisateurs sur le Web. Une session est une période pendant laquelle un utilisateur s'engage activement avec une application. La durée de vie d'une session commence lorsqu'un utilisateur se connecte et se termine lorsqu'il se déconnecte.

HTTP est un protocole sans état, vous devrez donc souvent suivre manuellement l'activité des utilisateurs.

Du côté serveur de votre application, vous pouvez générer une valeur unique, de préférence une valeur cryptographiquement sécurisée. Vous pouvez ensuite stocker cela dans un cookie que le client enverra à votre application lors de futures demandes, créant ainsi une forme d'état.

Séances en Go

Vous pouvez utiliser le package net/http pour implémenter des sessions, et de nombreux packages disponibles le font déjà. Le plus populaire est le forfait sessions Gorilla. Ce package fournit des fonctionnalités de stockage de cookies et de fichiers ainsi qu'une infrastructure backend de session personnalisée.

instagram viewer

Exécutez cette commande sur votre espace de travail Go pour installer le package de sessions Gorilla.

aller obtenir github.com/gorilla/sessions

Dans ce didacticiel, vous utiliserez un magasin de cookies pour les sessions. Vous utiliserez le package net/http pour démarrer un serveur Web qui vérifiera le problème de l'utilisateur et révoquera les sessions.

Voici la liste des importations dont vous aurez besoin pour suivre ce tutoriel.

importer (
"github.com/gorille/sessions"
"Journal"
"net/http"
)

La Journal package est destiné aux opérations liées à la journalisation en fonction de l'état de l'authentification de l'utilisateur.

Une implémentation simple du magasin de cookies

Vous aurez besoin d'un magasin de cookies pour vos fonctions de gestionnaire de connexion et de déconnexion. Pour votre magasin de cookies, vous aurez besoin d'une clé secrète pour l'authentification.

Voici une fonction pour la mise en œuvre du magasin de cookies.

// La fonction cookieStore crée un magasin de cookies avec la clé secrète de l'utilisateur
fonctioncookieStore() *séances.CookieStore {
CléSecrète := []octet("super-secret-SecretKey")
cookieStore := sessions. NouveauCookieStore (SecretKey)

// la fonction renvoie le magasin de cookies pour que d'autres fonctions puissent y accéder
revenir cookieStore
}

Dans le cookieStore fonction, la variable clé secrète déclarée Clef secrète est un exemple de clé secrète. En production, votre clé secrète doit être cryptographiquement sécurisée, en utilisant le package crypto par exemple. Vous devez également charger le secret à partir de un fichier de variables d'environnement.

La fonction renvoie une valeur de *séances. CookieStore type qui représente le magasin de cookies sécurisé avec la clé secrète. Vous utiliserez le CookieStore fonction dans votre connexion et Se déconnecter gestionnaires pour authentifier les utilisateurs et attribuer des sessions.

La fonction de gestionnaire de connexion

Vous voudrez vérifier si l'utilisateur est déjà connecté avant de créer une session dans votre fonction de gestionnaire de connexion. Vous pouvez utiliser le Obtenir méthode sur le magasin de cookies pour récupérer une session à partir du cookie et ajouter la session à la demande du client.

La Obtenir La méthode renvoie la session et une erreur que vous pouvez gérer. Si vous avez besoin d'authentifier l'utilisateur, vous pouvez vous authentifier ou autoriser dans le connexion gestionnaire.

// le gestionnaire de connexion récupère la session du cookie Store
fonctionconnexion(écrivain http. ResponseWriter, demande *http. Demande) {
session, err := cookieStore().Get (demande, "Nom du cookie de la demande")

si erreur != néant {
Journal. Fataln (erreur)
}

// définissez ici votre authentification d'utilisateur en fonction de l'opération
session. Valeurs["statut d'authentification"] = vrai
erreur = séance. Enregistrer (demande, rédacteur)

si erreur != néant {
revenir
}
}

La propriété Values ​​contient les données liées à la session dans le magasin de cookies :

La sauvegarder La méthode enregistre la session dans le magasin de cookies. Dans vos gestionnaires, vous aurez besoin d'autres mesures d'authentification pour une sécurité accrue.

Vérification du statut de connexion d'un utilisateur

Votre gestionnaire de vérification doit récupérer la session à partir du cookie du client en utilisant le magasin de cookies. Obtenir méthode. Ensuite, vous pouvez récupérer la session et authentifier l'utilisateur.

fonctioncheckAuthStatus(écrivain http. ResponseWriter, demande *http. Demande) {
session, err := cookieStore().Get (demande, "Nom du cookie de la demande")

si erreur != néant {
Journal. Fataln (erreur)
}

authentifié := session. Valeurs["statut d'authentification"]

si authentifié == vrai {
écrivain. Write Header (http. StatutOK) // écrit le code d'état 200
revenir
} autre {
écrivain. Write Header (http. StatusBadRequest) // écrit le code d'état http 400
revenir
}
}

La authentifié variable utilise la Valeurs propriété pour récupérer l'état du magasin de cookies. L'instruction if vérifie ensuite cet état d'authentification. S'il s'évalue à vrai, le client reçoit les 200 Code d'état HTTP. Si l'état d'authentification n'est pas vrai, le client reçoit le code d'état HTTP 400.

Le gestionnaire de déconnexion de session

Votre fonction de gestionnaire de déconnexion sera très similaire à la fonction de gestionnaire de connexion. Vous supprimerez toutes les données liées à la session de l'utilisateur du magasin de cookies et annulerez le statut d'authentification.

fonctionSe déconnecter(écrivain http. ResponseWriter, demande *http. Demande) {
session, err := cookieStore().Get (demande, "Nom du cookie de la demande")

si erreur != néant {
revenir
}

// annule la session de l'utilisateur du cookie Store
session. Valeurs["statut d'authentification"] = faux
erreur = séance. Enregistrer (demande, rédacteur)

si erreur != néant {
revenir
}
}

La Se déconnecter La fonction de gestionnaire annule le statut d'authentification de session de l'utilisateur et enregistre le statut dans le magasin de cookies.

Ne stockez pas de données sensibles dans les sessions

Les sessions sont idéales pour stocker des données, mais il est préférable d'éviter d'y stocker des données sensibles. Un attaquant peut détourner une session si vous stockez ses données dans un cookie et l'envoyez via HTTP simple. La sécurité de votre application est importante pour vos utilisateurs.

Les sessions sont avec état et il existe de nombreuses implémentations de bases de données de magasins de cookies pour le package Gorilla, pour les bases de données SQL et NoSQL.