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