Asegurando APIs de Node.js con Tokens de Identidad Descentralizados

Rate this content
Bookmark

La autenticación y autorización son problemas serios. A menudo dedicamos mucho tiempo a crear APIs poderosas pero pasamos por alto las medidas de seguridad adecuadas. Vamos a resolverlo con Magic utilizando una solución de identidad basada en claves sobre el estándar DID, donde las identidades de los usuarios son soberanas y se aprovechan de los pares de claves públicas y privadas de la cadena de bloques. En esta charla, veremos las formas adecuadas de asegurar nuestras APIs de Node.js con Tokens de Identidad Descentralizados. Pasaremos desde aprender qué son los estándares de Identidad Descentralizada, cómo las identidades de los usuarios son soberanas y se aprovechan de los pares de claves públicas y privadas de la cadena de bloques, por qué son el futuro de la seguridad de las APIs, y para poner en práctica la teoría construiremos una implementación real utilizando Node.js donde mostraré las mejores prácticas comunes.

9 min
11 Jun, 2021

Video Summary and Transcription

Esta charla introduce el concepto de asegurar una API de Node.js utilizando un token de identidad descentralizado. El token se codifica como una cadena Base64 y consta de una prueba y una afirmación. La API está construida utilizando Express y protegida utilizando Magic. La aplicación tiene múltiples rutas, siendo la ruta secreta protegida por middleware. Se verifica el encabezado de autorización y se valida el token DID para acceder a las rutas protegidas.

Available in English

1. Introducción a los Tokens de Identidad Descentralizados

Short description:

Bienvenidos a esta charla sobre cómo asegurar una API de Node.js utilizando un token de identidad descentralizado. Aprenderemos qué es un token de identidad descentralizado, construiremos una API de Node utilizando Express y la protegeremos utilizando Magic. El token DID está codificado como una cadena Base64, una tupla de cadena JSON, aprovechando el algoritmo de la cadena de bloques de Ethereum y la criptografía de curva elíptica. Consiste en una prueba y una afirmación, siendo la afirmación la representación de los datos del usuario y la prueba firmada utilizando el algoritmo de firma personal de Ethereum. La forma más sencilla de comenzar con Magic es utilizando el SDK del cliente y llamando a la función de inicio de sesión con correo electrónico. Construyamos la API ejecutando npx makemagic seleccionando la plantilla de API de Express.

Bienvenidos a esta charla, donde aprenderemos más sobre cómo asegurar una API de Node.js utilizando un token de identidad descentralizado. Mi nombre es Mohamed Shabaz Alam, un defensor del desarrollo en Magic. En esta charla, aprenderemos qué es un token de identidad descentralizado, construiremos una API de Node utilizando Express y luego protegeremos esa API utilizando Magic. Entonces, ¿qué es un token DID? El token DID creado por Magic se adapta a tecnologías anteriores como JWT y el protocolo W3 DID. Está codificado como una cadena Base64, una tupla de cadena JSON que representa una prueba y una afirmación. Utiliza el algoritmo de la cadena de bloques de Ethereum y la criptografía de curva elíptica para generar una prueba verificable de autenticación y autorización. Estas pruebas son firmas digitales livianas que se comparten entre el cliente y el servidor para gestionar permisos, proteger rutas y recursos y autenticar usuarios.

Un DID típico consta de una prueba y una afirmación. La afirmación es los datos sin firmar que representan los datos del usuario. Y la prueba se realiza firmando eso utilizando el algoritmo de firma personal de Ethereum y utilizando la clave privada del usuario. Y luego obtienes el token DID llamando a B2A y utilizando una cadena de tupla JSON en base64.

Así es como se ve un token DID básico, que consta de emisión, vencimiento, sujeto, DID, tiempo de no antes y todo tipo de información aquí. La emisión es donde usamos la clave pública del usuario en la afirmación. Y cuando firmamos utilizando la función de firma, utilizamos la clave privada del usuario, que nuevamente, no miramos esos datos. Y luego codificamos el token DID para que se pueda transportar fácilmente a través de HTTP. Y la forma más sencilla de comenzar con Magic es utilizando el SDK del cliente de Magic. El SDK del cliente es donde obtienes el token DID. Entonces usas eso, pasas la clave de la API, que son dos tipos de clave de API. Una es la clave publicable y la otra es la clave secreta. La clave secreta se utiliza para el servidor. La clave publicable es para aplicaciones cliente. Llamas a una función llamada inicio de sesión con correo electrónico y luego pasas el correo electrónico del usuario. De forma predeterminada, obtendrás un token DID con una duración de 15 minutos, pero si quieres más que eso, puedes llamar a la función getIDtoken para obtenerlo. El flujo de autenticación es que un usuario llama al cliente autenticándose, obtienen el token DID y lo intercambian en la cabecera de autorización con el servidor, y el servidor valida ese token y luego permite la ruta protegida. Así que construyamos la API. La forma más sencilla de comenzar es ejecutar npx makemagic seleccionando la plantilla de API de Express. Ya he hecho esto, y verán que ejecuté una aplicación. Solo mostraré cómo se ve. Por ejemplo, npx makemagic template express API, te pedirá el nombre de tu aplicación, prueba API, y luego puedes usar la clave secreta publicable. Por ejemplo, puedes obtener esta clave secreta iniciando sesión en Magic y registrándote.

2. Securing the Application

Short description:

Si no puedes ver esto, selecciona tu aplicación y revela la clave secreta. Una vez hecho esto, tu aplicación estará abierta en el puerto 8080 con múltiples rutas. La ruta básica está desprotegida, mientras que la ruta secreta está protegida por un middleware. La función isAuthorized verifica el encabezado de autorización, extrae el token DID y lo valida. Puedes obtener el token DID ejecutando NPX make magic y seleccionando la siguiente plantilla. Pasa la clave secreta para acceder a las rutas protegidas. Siéntete libre de explorar la documentación en magic y comunicarte si tienes alguna pregunta o problema.

Es gratis hacer eso y copiar la clave secreta de la carpeta de la aplicación. Si no puedes ver esto, selecciona esto y selecciona tu aplicación, y luego revela la clave secreta. Solo pégala aquí y luego selecciona tu aplicación, eso es todo. Y una vez que eso esté hecho, estará abierto y se verá algo así. Tu aplicación se está ejecutando en el puerto 8080, por lo que esto te da múltiples rutas. La ruta normal es la ruta básica, que te da una ruta desprotegida. Otra es la ruta secreta, que está protegida por un middleware que hemos escrito, que siempre puedes ver en el ejemplo. Ya he creado una aplicación llamada jsnationnav. Solo mira esta función, verás que no está sucediendo mucho, pero esta es una API muy básica, donde estamos usando la clave secreta de magic de la variable de entorno, también estamos usando una variable de puerto, y luego estamos instanciando magic aquí. Luego, esta es una lista de tareas por hacer, que simula la base de datos, pero obviamente necesitarías una base de datos adecuada. Esta es una ruta desprotegida, esta es una ruta protegida, la proteges llamando a isAuthorized. Mostraré cómo se ve la función isAuthorized. Entonces, este es el middleware y estas tareas por hacer son como rutas de API no protegidas, es una solicitud GET y obtiene un id, como obtener uno, como la primera tarea por hacer o la segunda tarea por hacer. Estas no están protegidas, por lo que otra forma de usar la ruta protegida o el middleware es usar app.use() y pasar las funciones de autorización, lo que hemos llamado isAuthorized, y luego todas estas rutas están protegidas por defecto porque las estamos usando aquí. Entonces, si queremos usarlo de la manera anterior, tendríamos que pasarlo a todas las funciones aquí. Veamos cómo se ve isAuthorized, acepta solicitud, respuesta y siguiente. Verificamos primero si el encabezado de autorización no está definido y luego extraemos el token DID del encabezado y luego llamamos a magic.token.validate(), que muestra si hay un error, dirán que hay un error y, de lo contrario, continuaremos llamando a siguiente y viceversa. Puedes encontrar más detalles cuando ejecutes NPX make magic y esta plantilla. Entonces, la forma más fácil de ver esto es obtener un token DID. La forma más fácil de obtener el token DID nuevamente es ejecutar NPX make magic y usar la plantilla next. Ejecutarán tu servidor y una vez que inicies sesión te dará un token DID.

Así que una vez que hagas eso, solo pasa la clave secreta aquí y he pegado esto y verás que esto está solicitando que estamos permitidos y si no lo estamos, diremos que esto ha fallado y tiene actualizaciones, put, delete y todo tipo de verbos HTTP restful. Así que puedes encontrar más información sobre eso. Entonces, la forma más fácil de ejecutarlo es obtener el token DID desde el frontend ejecutando este comando en particular: npx make magic y seleccionando una plantilla next. Por defecto, next no te dará mucha ayuda en términos de token DID. Entonces, lo que he hecho es que he tomado un DID aquí y luego llamando a la función get DID token y luego mostrando el token DID. Siéntete libre de explorar la documentación en magic y sí, estos son los recursos que puedes encontrar y aprender más sobre ellos y si tienes algún problema, simplemente ejecuta npx mdspzalm, mi nombre de usuario y luego habrá un montón de información. No dudes en comunicarte conmigo si tienes alguna pregunta. Así que sí, gracias de nuevo a JS Nation por tenerme y por una maravillosa conferencia. ¡Adiós!

Check out more articles and videos

We constantly think of articles and videos that might spark Git people interest / skill us up or help building a stellar career

Node Congress 2022Node Congress 2022
26 min
It's a Jungle Out There: What's Really Going on Inside Your Node_Modules Folder
Top Content
Do you know what’s really going on in your node_modules folder? Software supply chain attacks have exploded over the past 12 months and they’re only accelerating in 2022 and beyond. We’ll dive into examples of recent supply chain attacks and what concrete steps you can take to protect your team from this emerging threat.
You can check the slides for Feross' talk here.
Node Congress 2022Node Congress 2022
34 min
Out of the Box Node.js Diagnostics
In the early years of Node.js, diagnostics and debugging were considerable pain points. Modern versions of Node have improved considerably in these areas. Features like async stack traces, heap snapshots, and CPU profiling no longer require third party modules or modifications to application source code. This talk explores the various diagnostic features that have recently been built into Node.
You can check the slides for Colin's talk here. 
JSNation 2023JSNation 2023
22 min
ESM Loaders: Enhancing Module Loading in Node.js
Native ESM support for Node.js was a chance for the Node.js project to release official support for enhancing the module loading experience, to enable use cases such as on the fly transpilation, module stubbing, support for loading modules from HTTP, and monitoring.
While CommonJS has support for all this, it was never officially supported and was done by hacking into the Node.js runtime code. ESM has fixed all this. We will look at the architecture of ESM loading in Node.js, and discuss the loader API that supports enhancing it. We will also look into advanced features such as loader chaining and off thread execution.
JSNation 2023JSNation 2023
30 min
The State of Passwordless Auth on the Web
Can we get rid of passwords yet? They make for a poor user experience and users are notoriously bad with them. The advent of WebAuthn has brought a passwordless world closer, but where do we really stand?
In this talk we'll explore the current user experience of WebAuthn and the requirements a user has to fulfill for them to authenticate without a password. We'll also explore the fallbacks and safeguards we can use to make the password experience better and more secure. By the end of the session you'll have a vision for how authentication could look in the future and a blueprint for how to build the best auth experience today.

Workshops on related topic

Node Congress 2023Node Congress 2023
109 min
Node.js Masterclass
Top Content
Workshop
Have you ever struggled with designing and structuring your Node.js applications? Building applications that are well organised, testable and extendable is not always easy. It can often turn out to be a lot more complicated than you expect it to be. In this live event Matteo will show you how he builds Node.js applications from scratch. You’ll learn how he approaches application design, and the philosophies that he applies to create modular, maintainable and effective applications.

Level: intermediate
React Summit 2023React Summit 2023
56 min
0 to Auth in an hour with ReactJS
WorkshopFree
Passwordless authentication may seem complex, but it is simple to add it to any app using the right tool. There are multiple alternatives that are much better than passwords to identify and authenticate your users - including SSO, SAML, OAuth, Magic Links, One-Time Passwords, and Authenticator Apps.
While addressing security aspects and avoiding common pitfalls, we will enhance a full-stack JS application (Node.js backend + React frontend) to authenticate users with OAuth (social login) and One Time Passwords (email), including:- User authentication - Managing user interactions, returning session / refresh JWTs- Session management and validation - Storing the session securely for subsequent client requests, validating / refreshing sessions- Basic Authorization - extracting and validating claims from the session token JWT and handling authorization in backend flows
At the end of the workshop, we will also touch other approaches of authentication implementation with Descope - using frontend or backend SDKs.
JSNation 2023JSNation 2023
104 min
Build and Deploy a Backend With Fastify & Platformatic
WorkshopFree
Platformatic allows you to rapidly develop GraphQL and REST APIs with minimal effort. The best part is that it also allows you to unleash the full potential of Node.js and Fastify whenever you need to. You can fully customise a Platformatic application by writing your own additional features and plugins. In the workshop, we’ll cover both our Open Source modules and our Cloud offering:- Platformatic OSS (open-source software) — Tools and libraries for rapidly building robust applications with Node.js (https://oss.platformatic.dev/).- Platformatic Cloud (currently in beta) — Our hosting platform that includes features such as preview apps, built-in metrics and integration with your Git flow (https://platformatic.dev/). 
In this workshop you'll learn how to develop APIs with Fastify and deploy them to the Platformatic Cloud.
Node Congress 2023Node Congress 2023
63 min
0 to Auth in an Hour Using NodeJS SDK
WorkshopFree
Passwordless authentication may seem complex, but it is simple to add it to any app using the right tool.
We will enhance a full-stack JS application (Node.JS backend + React frontend) to authenticate users with OAuth (social login) and One Time Passwords (email), including:- User authentication - Managing user interactions, returning session / refresh JWTs- Session management and validation - Storing the session for subsequent client requests, validating / refreshing sessions
At the end of the workshop, we will also touch on another approach to code authentication using frontend Descope Flows (drag-and-drop workflows), while keeping only session validation in the backend. With this, we will also show how easy it is to enable biometrics and other passwordless authentication methods.
Table of contents- A quick intro to core authentication concepts- Coding- Why passwordless matters
Prerequisites- IDE for your choice- Node 18 or higher
JSNation Live 2021JSNation Live 2021
156 min
Building a Hyper Fast Web Server with Deno
WorkshopFree
Deno 1.9 introduced a new web server API that takes advantage of Hyper, a fast and correct HTTP implementation for Rust. Using this API instead of the std/http implementation increases performance and provides support for HTTP2. In this workshop, learn how to create a web server utilizing Hyper under the hood and boost the performance for your web apps.
React Summit 2022React Summit 2022
164 min
GraphQL - From Zero to Hero in 3 hours
Workshop
How to build a fullstack GraphQL application (Postgres + NestJs + React) in the shortest time possible.
All beginnings are hard. Even harder than choosing the technology is often developing a suitable architecture. Especially when it comes to GraphQL.
In this workshop, you will get a variety of best practices that you would normally have to work through over a number of projects - all in just three hours.
If you've always wanted to participate in a hackathon to get something up and running in the shortest amount of time - then take an active part in this workshop, and participate in the thought processes of the trainer.