Your Web News in One Place

Help Webnuz

Referal links:

Sign up for GreenGeeks web hosting
October 1, 2022 05:37 pm GMT

JWT y Golang

Bien sabemos lo complicado que es cubrir el 100% de los casos de uso cuando hablamos de registro de usuario, autorizacin y autenticacin. Eternas discusiones que nos consumen mucho tiempo y recursos para siempre dejar espacios en blanco que con el tiempo sern subsanados con nuevas versiones de nuestros servicios encargados de estas acciones. Siempre recomiendo, para cada desarrollo donde servidor y cliente estn separados, tener un mecanismo basado en Tokens (puede ser JWT, puede ser cualquier otro) para garantizar la autenticidad de las peticiones.

JWT y REST

Siempre lemos que en REST cada peticin tiene que ser independiente a su predecesora y sucesora, lo cual es falso para sistemas que requieran autenticacin, que a su vez, corresponden a la gran mayora de los que usamos en nuestras PCs y telfonos; es muy difcil imaginar poder hacer una transferencia bancaria sin autenticarse primero o querer publicar una entrada en un blog sin antes dejar mis credenciales.

Entonces, tenemos una primera peticin bien conocida, que es proveer nuestra identidad, sin importar de qu manera, SSO con Google, GitHub, email y password o biometra, le tenemos que dar algo para que el sistema confe en que somos nosotros. En un futuro, voy a intentar redactar modelos de autenticacin ms sofisticados para servidores web.

Una vez validadas las credenciales, el servidor nos otorga una llave para nuestras sucesivas peticiones dentro del mismo dominio, que suele ser un token (un string o cadena de caracteres), con un formato especfico que ambos entienden, firmado con un algoritmo (que ambos entienden) e informacin adicional que puede ser cualquier cosa, aunque se recomienda altamente no dejar nada sensible o que pueda llevarnos a conocer ms acerca de quin era -el dueo- del Token.

Morfologa del JWT

Sabemos por sus siglas en ingls, qu es JSON, es Web y es un Token, a su vez, cuenta con una estructura bien determinada en la cual se basa el mecanismo. Consta de 3 partes separadas por un punto y cada una de ellas contiene datos especficos, las libreras de los lenguajes nos ayudan a formar JWTs correctos y seguros. Tambin, estas tienen una estructura JSON y estn encodeadas en Base64.

stas partes son:

  1. Headers -> dnde se encuentran el algoritmo de encriptacin usado y el tipo de token.

  2. Payload -> ac, se encuentran los datos que queremos transportar del usuario, el campo "sub" (de subject) es donde comnmente se encuentra un identificador nico. Podemos agregar los campos que necesitemos pero es muy importante no agregar nada sensible por un simple hecho; en caso de que el token quede comprometido, la informacin es totalmente accesible, ya que solo est en formato de Base64 (al igual que las dems partes).

  3. Signature -> Este segmento valida la firma a la hora de verificar el token y si estaba sellado con una contrasea, debemos utilizar la misma, caso contrario el token va a ser detectado como invlido y por consiguiente, el cliente no podr consumir el recurso seguro.

Esta imagen es de la web jwt.io donde pueden practicar como crear uno y validarlo.
sitio web de jwt.io

Otros claims (campos) importantes en el payload de JWT son los de "iat" y "exp" que adems del "sub" deben viajar siempre y corresponden a issued at (cuando se firm) y expires at (cuando vence). Es muy comn en sitios web ver el check de remember me, la gran mayora de las veces esto es para firmar el token con un exp mucho mayor que si no estuviese checkeado.

Cmo lo hago en Golang?

En Go tenemos libreras muy fciles de usar, mi consejo es usarlo como servicio e inyectar cuando sea necesario, para despus usarlo como middleware, as su uso queda muy natural y desacoplado a la lgica de negocios.

Ac vemos para firmar el token, no necesitamos casi nada extra aparte de "github.com/golang-jwt/jwt", solo un secreto para firmar el token y los claims, que adems de los estndar, podemos agregar los que necesitemos. Es importante tener en cuenta el tag json para que queden con el formato esperado.

La expiracin del token queda grabada en esta firma tambin.

Ahora vemos como usarlo como un middleware en los web handlers y declarando como servicio

y con estos simples pasos ya podemos agregarlo a cualquier ruta como middleware, en caso de que estemos usando la std lib de Golang, en caso de usar algn framework web com o Gin, Fiber o Echo, vamos a tener que modificar un poco la firma, pero de lo contrario, ya est listo para ser implementado.

Si les gust el contenido, me pueden sponsorear aca!


Original Link: https://dev.to/tomaslingotti/jwt-y-golang-4opp

Share this article:    Share on Facebook
View Full Article

Dev To

An online community for sharing and discovering great ideas, having debates, and making friends

More About this Source Visit Dev To