¿Cómo gestionan las personas la autenticación en Go?


Para aquellos que crean API RESTful y aplicaciones JS front-end en Go, ¿cómo administra la autenticación? ¿Está utilizando alguna biblioteca o técnica en particular?

Me sorprende encontrar tan poca discusión sobre esto. Tengo en mente respuestas como las siguientes, y estoy tratando de evitar desarrollar mi propia implementación:

Formulario de Autenticación en ASP.Net

¿Está todo el mundo codificando su propia solución, por separado?

Author: Community, 2014-08-09

6 answers

Esta pregunta recibe un montón de puntos de vista has y tiene una insignia de Pregunta Popular so 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 las Interwebs.

La mayor parte de la información disponible resulta en el equivalente textual de la cosa ondulada de la mano, dejada como un "ejercicio para el lector." ;)

Sin embargo, finalmente he localizado un ejemplo concreto, (generosamente) proporcionado por un miembro del correo golang-nuts lista:

Https://groups.google.com/forum/#! msg / golang-nuts / GE7a_5C5kbA / fdSnH41pOPYJ

Esto proporciona un esquema sugerido y una 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 del post vea esto: Gracias!)

Extraído (y reformateado):


" Yo sugeriría algo así 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 PUBLICAR en TLS, determinar si la contraseña es válida.
  • Luego emita una clave de sesión aleatoria, digamos 50 o más caracteres rand criptográficos y cosas en una cookie segura.
  • Agregue esa clave de sesión a la tabla UserSession.
  • Luego, cuando vea ese usuario de nuevo, primero presione la tabla UserSession para ver si la sessionKey está allí con un LoginTime válido y LastSeenTime y el usuario no se elimina. Podría diseñarlo para que un temporizador borre automáticamente las filas antiguas en UserSession."
 98
Author: SexxLuthor,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-12-14 21:51:20

Otra posible solución es Authboss, recientemente anunciada en la lista de correo .

(No he intentado usar esta biblioteca.)

También ver La mejor manera de hacer una webapp con la autorización del usuario?

 16
Author: SexxLuthor,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-12-11 16:04:16

Usaría middleware para realizar la autenticación.

Puede probar go-http-auth para la autenticación básica y digest y gomniauth para OAuth2.

Pero cómo autenticarse realmente depende de tu aplicación.

La autenticación introduce el estado/contexto en su http.Handlers y ha habido alguna discusión sobre eso últimamente.

Las soluciones bien conocidas para el problema de contexto son gorilla / context y google context descrito aquí.

Hice una solución más general sin la necesidad de estado global en go-on/wrap que se puede usar juntos o sin los otros dos y se integra muy bien con el middleware libre de contexto.

Wraphttpauth proporciona la integración de go-http-auth con go-on/wrap.

 13
Author: metakeule,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-08-10 17:43:36

Otro paquete de código abierto para manejar la autenticación con cookies es httpauth.

(escrito por mí, por cierto)

 6
Author: Cameron Little,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-03-19 23:17:34

Respondiendo a esto en 2018. Sugiero usar JWT (JSON Web Token). La respuesta que marcó resuelto tiene inconveniente, que es el viaje que hizo frente(usuario) y atrás(servidor/base de datos). Lo que es peor si el usuario hizo una solicitud frecuente que necesita autenticación, resultará en una solicitud hinchada desde / hacia el servidor y la base de datos. Para resolver esto use 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 es necesario que el viaje al procesamiento de la base de datos y el servidor para verificar la validez del token tome poco tiempo.

 5
Author: mfathirirhas,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-05-05 17:16:52

Eche un vistazo a Labstack Echo: envuelve la autenticación para API RESTful y aplicaciones frontend en middleware que puede usar para proteger rutas API específicas.

Configurar la autenticación básica, por ejemplo, es tan sencillo como crear una nueva subrutina para la ruta /admin:

e.Group("/admin").Use(middleware.BasicAuth(func(username, password string, c echo.Context) (bool, error) {
    if username == "joe" && password == "secret" {
        return true, nil
    }
    return false, nil
}))

Vea todas las opciones de autenticación de middleware de Labstack aquí.

 0
Author: Adil B,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-05-30 18:15:06