La solución que hace casi al final de la clase, la de modificar el fichero auth.go y enviar una referencia al models.AppClaims, también debe hacerse a la función de MeHandler
La interface de la librería debería contemplar este problema en forma de chequeo de tipos y, especificar, que se debe recibir una referencia estrictamente. De esta forma el compilador te avisaría sobre este error en lugar de recibirlo cuando pruebas la aplicación.
Exacto, si no lo hubiera notado el profesor estaría dificil de debuggear ese error, por que a simple vista no se sabe bien donde se está originando
Para la abstracción de código he creado una carpeta llamada helpers y en ella un fichero llamado jwtHelper.go, el cual contiene la siguiente función:
Le falta añadir la referencia de models.AppClaims{}
Ya para no duplicar el código del middleware de autorización lo que hice fue extraer ahí mismo el userId del token e insertarlo en los headers.
Entonces cuando llega al MeHandler puedo extraer del los headers el userId.
No se si esté bien, me gustaría que alguien me diera su opinión
Este es el middleware
Este es el handler
No se si es la respuesta correcta, pero tambien podes usar el context.
en la funcion CheckAuthMiddleware:
if claims,ok:= token.Claims.(*models.AppClaims); ok && token.Valid{ctx:= r.WithContext(context.WithValue(r.Context(),"userId", claims.UserId)) next.ServeHTTP(w, ctx)return}
en MeHandler:
result,ok:= r.Context().Value("userId").(string)if ok {println(result)}
Les comparto una opción para no repetir el código de verificación del token .
En el middleware, al verificar el token podemos obtener el UserId y lo guardamos en el contexto de ejecución; posteriormente en el handler podemos recuperarlo y traer la data del usuario.
Cómo hago para enviar un Bearer token en vez del token solo?
En esta clase tenemos un problema ya que creamos el mdw pero replicamos todo el código dentro del un nuevo handler, lo unico que debimos hacer fue agregar en los routes este mdw de la siguiente forma:
Una posible solución para el reto que nos plantea Nestor es la siguiente:
funcParseToken(hauth string, claims jwt.Claims)(jwt.Token,error){// hauth: Autohorization Header// claims: Any type that implemnts jwt.Claims. AppClaims Does b/c jwt.StandardClaims does. strim := strings.TrimSpace(hauth) token, err := jwt.ParseWithClaims(strim, claims,func(t *jwt.Token)(interface{},error){return[]byte(database.BuildConfig().JWTSecret),nil})return*token, err
}
el database.BuildConfig está apuntando al archivo de configuración,, que a propósito no estaría mal sacarlo de server.go y tenerlo en su propio archivo config.go., esto entre otras cosas ahorraría tener que pasar el servidor como parámetro en los los middlewares.