estoy tratando de crear un punto final/api de inicio de sesión, y estoy enviando los datos de inicio de sesión del usuario a través de los encabezados de autenticación, ¿está bien para la seguridad? los encabezados de autorización en realidad contienen un objeto, están codificados en Base64, contienen datos de usuario como contraseña hash (aún no hash en este código), nombre de usuario y algún tipo de clave de servidor (para autorizar si es el cliente correcto que enviando una solicitud de API), solo quiero asegurarme de si es seguro o no ...
const aFunction = (req, res) => { require('crypto').randomBytes(48, function(err, buffer) { const token = buffer.toString('hex'); const auth = JSON.parse(Buffer.from(req.headers.authorization, 'base64').toString('ascii')) if(auth.serverkey == version["serverkey"]){ loginUser(auth.username,token).then(data =>{ if (data.rows.length < 1 || data.rows[0].password != auth.password) { res.send({ status: "failed", message: "Username/Password is wrong", status_code: 400 }) }else{ res.send({ status: "success", message: "successfully logged in", status_code: 200, token: token }) } }) }else{ res.send({ status: "failed", message: "Unauthorized Client", status_code: 401 }) } }); }Agregaría un cheque para if (req.secure) a su código, y rechazaría cualquier solicitud que no sea https que se le presente. (No haga esto si su programa nodejs está detrás de un proxy inverso).
Los usuarios con navegadores pueden ver todo lo que envías a tu servidor, ya sea a través de https o http. (devtools) Entonces, si al leer sus encabezados pueden descubrir cómo enviarle encabezados maliciosos, entonces alguien lo hará. Y la codificación base64 tiene exactamente la misma seguridad que ninguna codificación. Así que agrega sal y hash a tus contraseñas. Utilice el paquete bcrypt o jwts.
Manejaría los errores de esta manera, llamando a next() con un parámetro de error en lugar de usar .send() para enviar un mensaje de error. Utilice este tipo de código.
const createError = require('http-errors') ... const myfunction (req, res, next) { ... if (!req.secure) return next(createError(403, 'https required')) ... });