this is the code that I made using javascript, express and jwt for authentication to learn restful api but I am constrained when checking in postman for endpoint /tasks, an error always appears "error: invalid token" even though I have entered the jwt token that matches what I got from the endpoint login

index.js

const express = require("express");
const fs = require("fs");
const jwt = require("jsonwebtoken");
const api = express();
const HOST = "localhost";
const PORT = 3000;
const SECRET_KEY = "your_secret_key"; // Ganti dengan kunci rahasia Anda

api.use(express.json());

// Fungsi untuk memuat data dari file JSON
const loadData = () => {
  const data = fs.readFileSync("data.json", "utf8");
  return JSON.parse(data);
};

// Fungsi untuk menambahkan data baru ke file JSON
const addData = (task) => {
  const tasks = loadData();
  task.id = tasks.length + 1;
  tasks.push(task);
  fs.writeFileSync("data.json", JSON.stringify(tasks));
};

// Fungsi untuk mendapatkan token JWT dari payload
const generateToken = (payload) => {
  return jwt.sign(payload, SECRET_KEY);
};

// Middleware untuk verifikasi token JWT
const verifyToken = (req, res, next) => {
  const token = req.headers["authorization"];

  if (!token) {
    return res.status(403).json({ error: "Token is required" });
  }

  jwt.verify(token, SECRET_KEY, (err, decoded) => {
    if (err) {
      return res.status(401).json({ error: "Invalid token" });
    }
    req.user = decoded;
    next();
  });
};

// Endpoint untuk registrasi (sign-up)
api.post("/register", (req, res) => {
  // Proses pendaftaran pengguna (diimplementasikan sesuai kebutuhan)
  const { username, password } = req.body;
  // Contoh sederhana, hanya menampilkan data yang didaftarkan
  res.status(201).json({ username, password });
});

// Endpoint untuk login
api.post("/login", (req, res) => {
  // Proses autentikasi pengguna (diimplementasikan sesuai kebutuhan)
  const { username, password } = req.body;
  // Contoh sederhana, hanya menampilkan token JWT
  const token = generateToken({ username });
  res.status(200).json({ token });
});

// Endpoint untuk menampilkan semua tugas (READ)
api.get("/tasks", verifyToken, (req, res) => {
  const data = loadData();
  res.status(200).json(data);
});

// Endpoint untuk menampilkan tugas berdasarkan parameter id (READ)
api.get("/tasks/:id", verifyToken, (req, res) => {
  const id = parseInt(req.params.id);
  const data = loadData()
  const task = data.filter(task => task.id == id);

  if (!task) {
    return res.status(404).json({ error: "Task not found" });
  }

  res.status(200).json(task);
});

// Endpoint untuk menambahkan tugas baru (CREATE)
api.post("/tasks", verifyToken, (req, res) => {
  addData(req.body);
  res.status(201).json(loadData());
});

// Endpoint untuk mengupdate tugas berdasarkan ID (UPDATE)
api.put("/tasks/:id", verifyToken, (req, res) => {
  const id = parseInt(req.params.id);
    const newData = req.body;
    const data = loadData();
    let updated = false;
  
    const updatedData = data.map(task => {
      if (task.id === id) {
        Object.assign(task, newData);
        updated = true;
      }
      return task;
    });
  
    if (!updated) {
      return res.status(404).json({ error: "Task not found" });
    }
  
    fs.writeFileSync('data.json', JSON.stringify(updatedData));
    res.status(200).json(loadData());
});

// Endpoint untuk menghapus tugas berdasarkan ID (DELETE)
api.delete("/tasks/:id", verifyToken, (req, res) => {
  const id = parseInt(req.params.id);
    const data = loadData();
    const newData = data.filter(task => task.id !== id);
  
    if (data.length === newData.length) {
      return res.status(404).json({ error: "Task not found" });
    }
  
    fs.writeFileSync('data.json', JSON.stringify(newData));
    res.status(200).json(loadData());
});

api.listen(PORT, () => console.log(`API running at ${HOST}:${PORT}!`));


how can I display the /tasks and /task/:id endpoints when doing a check in postman

0

There are 0 best solutions below