Las sesiones son una opción popular para la autenticación de usuarios en la web. Una sesión es un período durante el cual un usuario interactúa activamente con una aplicación. La vida útil de una sesión comienza cuando un usuario inicia sesión y finaliza cuando cierra sesión.
HTTP es un protocolo sin estado, por lo que a menudo deberá realizar un seguimiento manual de la actividad del usuario.
En el lado del servidor de su aplicación, puede generar un valor único, preferiblemente uno criptográficamente seguro. Luego puede almacenar eso en una cookie que el cliente enviará a su aplicación en futuras solicitudes, creando una forma de estado.
Sesiones en Go
Puede usar el paquete net/http para implementar sesiones y hay muchos paquetes disponibles que ya hacen esto. El más popular es el paquete de sesiones Gorilla. Este paquete proporciona funcionalidad de almacenamiento de archivos y cookies junto con una infraestructura de back-end de sesión personalizada.
Ejecute este comando en su espacio de trabajo de Go para instalar el paquete de sesiones de Gorilla.
Vamos obtener github.com/gorilla/sessions
En este tutorial, utilizará un almacén de cookies para las sesiones. Utilizará el paquete net/http para iniciar un servidor web que verificará el problema del usuario y revocará las sesiones.
Aquí está la lista de importaciones que necesitará para seguir este tutorial.
importar (
"github.com/gorila/sesiones"
"Iniciar sesión"
"red/http"
)
los Iniciar sesión El paquete es para operaciones relacionadas con el registro según el estado de la autenticación del usuario.
Una implementación simple de tienda de cookies
Necesitará un almacén de cookies para sus funciones de controlador de inicio y cierre de sesión. Para su tienda de cookies, necesitará una clave secreta para la autenticación.
Aquí hay una función para la implementación del almacén de cookies.
// la función cookieStore crea un almacén de cookies con la clave secreta del usuario
funcióntienda de galletas() *sesiones.tienda de galletas {
Clave secreta := []byte("super-secret-SecretKey")
cookieStore := sesiones. Nueva tienda de cookies (clave secreta)
// la función devuelve el almacén de cookies para que otras funciones puedan acceder a él
devolver tienda de galletas
}
En el tienda de galletas función, la variable de clave secreta declarada Llave secreta es un ejemplo de clave secreta. En producción, su clave secreta debe ser criptográficamente segura, utilizando el paquete criptográfico, por ejemplo. También debe cargar el secreto de un archivo de variables de entorno.
La función devuelve un valor de la *sesiones. tienda de galletas tipo que representa el almacén de cookies protegido con la clave secreta. Usarás el tienda de galletas funcionar en su acceso y cerrar sesión controladores para autenticar a los usuarios y asignar sesiones.
La función del controlador de inicio de sesión
Querrá verificar si el usuario ya inició sesión antes de crear una sesión en su función de controlador de inicio de sesión. Puedes usar el Obtener en el almacén de cookies para recuperar una sesión de la cookie y agregar la sesión a la solicitud del cliente.
los Obtener El método devuelve la sesión y un error que puede manejar. Si necesita autenticar al usuario, puede autenticarse o autorizarse en el acceso manipulador.
// el controlador de inicio de sesión recupera la sesión del almacén de cookies
funciónacceso(escritor http. ResponseWriter, solicitud *http. Solicitud) {
session, err := cookieStore().Get (solicitud, "Nombre de la cookie de la solicitud")si error! = nulo {
Iniciar sesión. fatal (err)
}// configure su autenticación de usuario aquí según la operación
sesión. Valores["estado de autenticación"] = verdadero
error = sesión. Guardar (solicitud, escritor)
si error! = nulo {
devolver
}
}
La propiedad Values contiene los datos relacionados con la sesión en el almacén de cookies:
los Ahorrar El método guarda la sesión en el almacén de cookies. En sus controladores, necesitará otras medidas de autenticación para una mayor seguridad.
Verificación del estado de inicio de sesión de un usuario
Su controlador de verificación debe recuperar la sesión de la cookie del cliente utilizando el almacén de cookies Obtener método. Luego puede recuperar la sesión y autenticar al usuario.
funcióncomprobar el estado de autenticación(escritor http. ResponseWriter, solicitud *http. Solicitud) {
session, err := cookieStore().Get (solicitud, "Nombre de la cookie de la solicitud")si error! = nulo {
Iniciar sesión. fatal (err)
}autenticado := sesión. Valores["estado de autenticación"]
si autenticado == verdadero {
escritor. WriteHeader (http. EstadoOK) // escribir 200 código de estado
devolver
} más {
escritor. WriteHeader (http. EstadoBadRequest) // escribir código de estado 400 http
devolver
}
}
los autenticado variable utiliza el Valores property para recuperar el estado del almacén de cookies. La instrucción if luego verifica este estado de autenticación. Si se evalúa a verdadero, el cliente recibe los 200 Código de estado HTTP. Si el estado de autenticación no es verdadero, el cliente recibe el código de estado HTTP 400.
El controlador de cierre de sesión
La función del controlador de cierre de sesión será muy similar a la función del controlador de inicio de sesión. Eliminarás todos los datos relacionados con la sesión del usuario del almacén de cookies y anularás el estado de autenticación.
funcióncerrar sesión(escritor http. ResponseWriter, solicitud *http. Solicitud) {
session, err := cookieStore().Get (solicitud, "Nombre de la cookie de la solicitud")si error! = nulo {
devolver
}// anular la sesión del usuario desde el almacén de cookies
sesión. Valores["estado de autenticación"] = falso
error = sesión. Guardar (solicitud, escritor)
si error! = nulo {
devolver
}
}
los cerrar sesión La función del controlador anula el estado de autenticación de la sesión del usuario y guarda el estado en el almacén de cookies.
No almacene datos confidenciales en sesiones
Las sesiones son excelentes para almacenar datos, pero es mejor evitar almacenar datos confidenciales en ellas. Un atacante puede secuestrar una sesión si almacena sus datos en una cookie y los envía a través de HTTP simple. La seguridad de su aplicación es importante para sus usuarios.
Las sesiones tienen estado y hay muchas implementaciones de bases de datos de almacenes de cookies para el paquete Gorilla, tanto para bases de datos SQL como NoSQL.