authentication - golang - ¿Cómo están manejando las personas la autenticación en Go?
golang jwt package (6)
Esta pregunta recibe un montón de visitas y tiene una insignia de Pregunta popular, así que sé que hay un gran interés latente en este tema, y muchas personas están preguntando exactamente lo mismo y no encuentran respuestas en Interwebs.
La mayor parte de la información disponible da como resultado el equivalente textual de la cosa ondulada a mano, dejada como un "ejercicio para el lector". ;)
Sin embargo, finalmente encontré un ejemplo concreto (generosamente) proporcionado por un miembro de la lista de correo de golang-nuts:
https://groups.google.com/forum/#!msg/golang-nuts/GE7a_5C5kbA/fdSnH41pOPYJ
Esto proporciona un esquema sugerido y la implementación del lado del servidor como base para la autenticación personalizada. El código del lado del cliente aún depende de usted.
(Espero que el autor de la publicación vea esto: ¡Gracias!)
Extraído (y reformateado):
"Sugeriría algo como el siguiente diseño:
create table User (
ID int primary key identity(1,1),
Username text,
FullName text,
PasswordHash text,
PasswordSalt text,
IsDisabled bool
)
create table UserSession (
SessionKey text primary key,
UserID int not null, -- Could have a hard "references User"
LoginTime <time type> not null,
LastSeenTime <time type> not null
)
- Cuando un usuario inicia sesión en su sitio a través de un POST bajo TLS, determine si la contraseña es válida.
- Luego, emita una clave de sesión aleatoria, digamos 50 o más caracteres crypto rand y esas cosas en una Cookie segura.
- Agregue esa clave de sesión a la tabla UserSession.
- Luego, cuando vuelva a ver a ese usuario, primero presione la tabla UserSession para ver si SessionKey está allí con un LoginTime válido y LastSeenTime y el usuario no se elimina. Puede diseñarlo para que un temporizador borre automáticamente las filas antiguas en UserSession ".
Para aquellos que compilan API RESTful y aplicaciones de front-end JS en Go, ¿cómo gestionas la autenticación? ¿Estás usando alguna biblioteca o técnica en particular?
Estoy sorprendido de encontrar tan poca discusión sobre esto. Recuerdo respuestas como las siguientes, y trato de evitar desarrollar mi propia implementación:
Formulario de autenticación en ASP.Net
¿Todos están codificando su propia solución, por separado?
Otra posible solución es Authboss , anunciada recientemente en la list correo.
(No he intentado usar esta biblioteca)
Ver también ¿La mejor forma de crear una aplicación web con autenticación de usuario?
Otro paquete de código abierto para manejar la autenticación con cookies es httpauth .
(escrito por mí, por cierto)
Respondiendo a esto en 2018. Sugiero usar JWT (JSON Web Token). La respuesta que marcó como resuelta tiene un inconveniente, que es el viaje que hizo al frente (usuario) y atrás (servidor / db). Lo que es peor si el usuario solicitó con frecuencia que necesita auth, dará como resultado una solicitud inflada desde / hacia el servidor y la base de datos. Para resolverlo, utilice JWT, que almacena el token en el extremo del usuario, que puede ser utilizado por el usuario en cualquier momento que necesite acceso / solicitud. No hay necesidad de un viaje a la base de datos y el procesamiento del servidor para comprobar la validez del token tomar poco tiempo.
Utilizaría middleware para hacer la autenticación.
Puede probar go-http-auth para la go-http-auth básica y gomniauth y gomniauth para OAuth2.
Pero la forma de autenticarte realmente depende de tu aplicación.
La autenticación introduce estado / contexto en sus manejadores de http y ha habido cierta discusión sobre eso últimamente.
Las soluciones bien conocidas para el problema de contexto son el contexto gorilla/context y google descrito here .
Hice una solución más general sin la necesidad de un estado global en go-on/wrap que se pueda usar en conjunto o sin los otros dos y se integra muy bien con middleware libre de contexto.
wraphttpauth proporciona integración de go-http-auth con go-on / wrap.
qor / auth es también un buen sistema de autenticación modular para desarrollo web en Golang