jsonwebtoken golang authentication go

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?



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