Ojito Ojito… en el video logró hacer el PUT porque el lo creo por SU propia cuenta cuando nos dejó el reto de que lo crearamos nosotros …
REVISA LA DOCUMENTACION DE LA CLASE PARA VER COMO LO HIZO
EN => API/COMPONENT/USER/NETWORK
Introducción al proyecto del curso y su arquitectura
Arquitectura de un backend complejo
Estructuras de datos para nuestro proyecto
Creando la estructura principal
Estructura inicial del proyecto: API y rutas
Aislar el código de la base de datos
Rutas para usuarios
Documentación de nuestra API
Autenticación basada en tokens
JWT: Gestión de acceso
Autenticación: registro
Autenticación: login
Autenticación: cifrar contraseñas para evitar problemas de seguridad
Autenticación: gestión de permisos
Comprobar verificación con token
Gestión avanzada de errores: Throw
Almacenando datos: MySql
Base de datos real: MySQL
Completando la base de datos
Relacionando entidades: follow
Posts y likes
Microservicios en Node
Microservicios: pros y contras
Separando la base de datos a un microservicio
Conectando con nuestro microservicio de datos
Separando los posts a un microservicio
Gestión de microservicios con PM2
Puesta en producción serverless
Microservicios en Zeit Now, serverless y seguridad
Variables de entorno en Now y despliegue local
Cacheando nuestra aplicación
Caché como un microservicio. Redis
Conectando el microservicio a Redis
Conectar la API al caché
Puesta en producción en virtual machine
Desplegando los servicios de Node
Nginx como proxy inverso
No tienes acceso a esta clase
¡Continúa aprendiendo! Únete y comienza a potenciar tu carrera
Implementar un middleware de autenticación es esencial para garantizar la seguridad de una aplicación. Este middleware evita que se accedan a funciones sensibles sin los permisos adecuados. Se centra en procesar solicitudes y verificar el acceso antes de permitir el paso a cualquier lógica de la aplicación. Así, se minimiza el riesgo en el caso de un fallo de seguridad.
Para comenzar, es útil crear un nuevo archivo de JavaScript donde se escribirá el middleware. Este archivo podría llamarse secure.js
y se alojaría en un directorio designado para los archivos de servicio. La función principal del archivo será exportar un middleware que valide las acciones permitidas.
// secure.js
module.exports = function(action) {
return function middleware(req, res, next) {
switch (action) {
case 'edit':
if (req.user.canEdit) {
next();
} else {
res.status(403).send("No tienes permiso para editar.");
}
break;
default:
next();
}
};
};
La función será capaz de manejar diferentes acciones basadas en el input. Utilizando un switch
, podemos determinar si un usuario está permitido para realizar una acción específica. Aquí es donde se define la lógica de autenticación.
function secureAction(action) {
return (req, res, next) => {
switch(action) {
case 'edit':
console.log("Acción de Editar ejecutada");
break;
// Otros casos para otras acciones
default:
next();
}
};
}
Para la autenticación basada en tokens, es típico manipular tokens JWT (JSON Web Tokens). Primero se requiere decodificar el token recibido en las solicitudes para verificar su validez.
const jwt = require('jsonwebtoken');
function decodeToken(req) {
const authorization = req.headers['authorization'] || '';
const token = authorization.split(' ')[1];
if (!token) {
throw new Error('Token no proporcionado');
}
try {
const decoded = jwt.verify(token, 'secret_key');
req.user = decoded;
return next();
} catch (error) {
res.status(401).send("Token inválido");
}
}
Al gestionar la seguridad, es crucial configurar variables de entorno que gestionen datos sensibles. El secreto JWT es uno de estos datos y debería configurarse en un archivo de configuración.
// config.js
module.exports = {
jwtSecret: process.env.JWT_SECRET || 'default_secret'
};
En este punto, se puede utilizar esta configuración para verificar los tokens y proporcionar un entorno seguro en la aplicación.
La verificación de credenciales y autorizaciones es fundamental para evitar accesos no autorizados a recursos críticos. La implementación del middleware y la correcta gestión del token de autenticación son técnicas cruciales para proteger las aplicaciones web. Tener un sistema robusto de autenticación no solo mejora la seguridad, sino que también proporciona confianza a los usuarios.
En la siguiente sección, se continuará explorando cómo manejar correctamente los tokens y utilizar estas configuraciones para asegurar aún más las rutas de la aplicación.
Aportes 20
Preguntas 2
Ojito Ojito… en el video logró hacer el PUT porque el lo creo por SU propia cuenta cuando nos dejó el reto de que lo crearamos nosotros …
REVISA LA DOCUMENTACION DE LA CLASE PARA VER COMO LO HIZO
EN => API/COMPONENT/USER/NETWORK
Funciones anónimas complican el debug, funciones con nombres facilitan la vida. Sabias palabras del prof… 😃
Es más fácil hacer revisión de fallos cuando las funciones tienen nombres, que cuando son fuciones anónimas.
Se me hace muy rebuscada la manera de programar que tiene el profesor.
Hasta este punto del curso me parece mucho mejor explicado los mismos temas y más sencillo de entender en los cursos de Nicolas Molina.
No tengo muy claro como el middelware de secure.js, entra en ejecución, no veo que en ningun momento que lo llamen o lo importen, alguien me puede decir; ¿como entra a ejecutarse este archivo si nada lo esta llamando?
de donde viene la función next() ? se que ejecuta la siguiente función (creo…) pero no explico o no me escuche de donde, es propia de Node ?
middleware = intermediario
que es Bearer???
Creamos user/secure.js
:
const auth = require('../../../auth');
module.exports = function checkAuth(action) {
function middleware(req, res, next) {
switch (action) {
case 'update':
const owner = req.body.id;
auth.check.own(req, owner);
break;
default:
next();
break;
}
return middleware;
}
}
Actualizamos ./auth/index.js
:
const { header } = require('express/lib/request');
const jwt = require('jsonwebtoken');
const config = require('../config');
const secret = config.jwt.secret;
function sign(data) {
return jwt.sign(data, secret);
}
function verify(token) {
return jwt.verify(token, secret);
}
const check = {
own: function(req, owner) {
const decoded = decodeHeader(req);
console.log(decoded);
}
}
function getToken(auth) {
if (!auth) {
throw new Error('¡No viene token!');
}
if (auth.indexOf('Bearer ') === -1) {
throw new Error('¡Formato inválido!');
}
let token = auth.replace('Bearer ', '');
return token;
}
function decodeHeader(req) {
const authorization = req.headers.authorization || '';
const token = getToken(authorization);
const decoded = verify(token);
req.user = decoded;
return decoded;
}
module.exports = {
sign
}
Actualizamos ./config.js
:
module.exports = {
api: {
port: process.env.API_PORT || 3000,
},
jwt: {
secret: process.env.JWT_SECRET || 'notASecret!'
}
}
a alguien más le pasa que cuando le hablan de middleware no tiene idea de que es lo que hablan ?
Alguien me lo podría explicar en palabras muy simples? 😦
✌
Tip de funciones anónimas vs funciones normales
Ok, Muy interesante
decode Token
Aunque en el router deberia ir una ruta con un params id como esta:
router.put('/:id', upsert);
ya que el profesor definió las siguientes:
router.post('/', upsert); router.put('/', upsert);
para respetar estas rutas tuve que adaptar en el “store/dummy.js” el metodo upsert para que permita editar tomando en cuenta que el id (en este caso) vendria desde el body.
async function upsert(tabla, data) {
if (!db[tabla]) {
db[tabla] = [];
}
for (let i = 0; i < db[tabla].length; i++) {
if(db[tabla][i].id === data.id){
db[tabla][i] = data;
return;
}
}
db[tabla].push(data);
console.log(db);
}
¿Quieres ver más aportes, preguntas y respuestas de la comunidad?