Asumiré que te refieres a la primera opción (la de los JWTs) y que ya tendrás instaladas todas tus dependencias necesarias. En este caso usaré solo las bibliotecas express.js para hacer un servidor sencillo a modo de ejemplo y jsonwebtoken.js para la implementación de los JWT.
 
// Biblioteca usada en este ejemplo para iniciar un servidor en node.js
const express = require('express');
const app = express();
// Biblioteca para el uso de Jason Web Tokens
const jwt = require('jsonwebtoken')

// Middleware que utiliza express para las solicitudes tipo POST o PUT
app.use(express.urlencoded({extended: false}));
app.use(express.json());

// Lo más seguro es tener tu SECRETO en alguna variable de entorno y no
// en tu código fuente, para este ejemplo la asignaremos aquí mismo.
// El SECRETO es una cadena o hash que se que se utiliza
// como llave en la encriptación de tu JWT
const SECRET = "mi_secreto_inseguro";

app.get('/', (req, res) => {
  res.send('Hola mundo!');
});

// Ruta POST para los datos de de autenticación
app.post('/auth', (req, res) => {
  const {username, password} = req.body;

  // Aquí va tu procedimiento de consulta en tu base de datos de usuarios
  // así como tu validación de usuario y contraseña.
  // Asumiendo que la autenticación fue correcta creemos un objeto con
  // la información que quieras agregar a tu token, en este caso solo es
  // el nombre de usuario
  const content = {username: username};

  const accessToken = genAccessToken(content);

  res.header('authorization', accessToken).json({
    message: '¡Usuario autenticado!',
    token: accessToken
  })
});

// Función que genera y retorna un token de acceso
function genAccessToken(content){
  return jwt.sign(content, SECRET, {expiresIn: '5m'});
}

// Función para la validación de un token
function validateToken(req, res, next){
  // Recibir token ya sea de headers o una query por url,
  // puedes remover esta última (a partir del ||) una vez hayas terminado
  // de hacer las pruebas correspondientes.
  const accessToken = req.headers['authorization'] || req.query.accessToken;
  if(!accessToken) res.send('Acceso denegado! Token no recibido.');

  jwt.verify(accessToken, SECRET, (err, content) => {
    if(err){
      res.send('Acceso denegado. Token incorrecto o expirado.');
    } else {
      next();
    }
  });
}

// Ruta get para el formulario de autenticación recuerda que debe
// tener como "action" la ruta que determinaste antes
app.get('/login', (req, res) => {
  res.send(`
    <!DOCTYPE html>
    <html lang="en">
    <head>
      <meta charset="UTF-8">
      <title>Login</title>
    </head>
    <body>
      <form action="/auth" method="post">
        Nombre de usuario: <input type="text" name="user" /><br>
        Contraseña: <input type="password" name="password" /><br>
        <input type="submit" value="Iniciar sesión" />
      </form>
    </body>
    </html>
    `);
});

app.get('/api', validateToken, (req, res) => {
  res.json({
    "ejemlpo": {
      "aquí": "puedes presentar tus respuestas al cliente en formato JSON"
    }
  });
});

app.listen(3000, () => {
  console.log('Servidor iniciado...');
});
spam fails_task lang_mismatch pii not_appropriate hate_speech sexual_content quality toxicity humor helpfulness creativity violence