āļŠāļēāļĢāļāļēāļāļāļąāļāđāļāļĩāļĒāļ
āļāļļāļāļāļāļāļīāļāļ§āđāļē āđāļĄāļ·āđāļāđāļĢāļēāļāđāļāļāļāļēāļĢāļŠāļĢāđāļēāļ Web Application āļāļķāđāļāļĄāļēāđāļāļ·āđāļāđāļŦāđāļāļĢāļīāļāļēāļĢāļāđāļāļĄāļđāļĨāđāļāđāļāļļāļāļāļĨāļāļąāđāļ§āđāļ āļāļ°āđāļĢāļāļ·āļāļŠāļīāđāļāđāļĢāļāļāļĩāđāđāļĢāļēāļāļ§āļĢāļāđāļāļāļāļģ āđāļāđāļāļāļāļ§āđāļēāļāļģāļāļāļāļāđāļāļ·āļ āļĢāļ°āļāļ Authentication āļāļąāđāļāđāļāļ
āđāļĨāđāļ§āļĢāļ°āļāļ Authentication āļĄāļąāļāļāļ·āļāļāļ°āđāļĢāļāļąāļāļĨāđāļ°
āļāļļāļāļāļāļāļāļāļ°āđāļāļĒ Login āđāļ§āļĨāļēāļāļĩāđāļāđāļāļāļāļēāļĢāđāļāđāļēāđāļāđāļāļēāļ Website āļŦāļĢāļ·āļ Application āļāļąāļāļĄāļēāļāđāļēāļāđāļāđāļĄāļąāđāļĒ āļĢāļ°āļāļāļāļēāļĢāļĒāļ·āļāļĒāļąāļāļāļąāļ§āļāļāļāļĩāđāļāļ°āļāļāļĒāļāļāļ Website āļŦāļĢāļ·āļ Application āđāļŦāļĨāđāļēāļāļąāđāļāļ§āđāļēāđāļĢāļēāļāļ·āļāđāļāļĢāļāļąāđāļāđāļŦāļĨāļ°āļāļ·āļāļŠāļīāđāļāļāļĩāđāđāļĢāļĩāļĒāļāļ§āđāļē āļĢāļ°āļāļ Authentication
āļāļķāđāļāļāļ§āļēāļĄāļĒāļēāļāļāļāļāļāļēāļĢāļāļģāļĢāļ°āļāļ Authentication āļāļ·āļ
āļāļēāļĢāļāļĩāđ Web Application āļāļąāđāļāļĄāļĩāļĢāļđāļāđāļāļāļāļēāļĢāļŠāļ·āđāļāļŠāļēāļĢāļāļĩāđāđāļĄāđāļĢāļđāđāļāļąāļāļāļāļāļģāļāļ°āđāļĢāđāļĨāļĒ āļāļģāđāļŦāđāļāļļāļ Request āļāļĩāđ User āļŠāđāļāđāļāļĒāļąāļāļĢāļ°āļāļāļāđāļāļ°āļāđāļāļāļāļđāļāļāļĢāļ§āļāļŠāļāļāļŠāļīāļāļāļīāđāđāļŦāļĄāđāļāļļāļāļāļĢāļąāđāļ āļāļēāļāļēāļĢāđāļāļāļāļĩāđāļāļāļāļĄāļąāļāļāļđāļāđāļĢāļĩāļĒāļāļ§āđāļē Stateless āļāļĨāđāļēāļ§āļāļ·āļ āļŦāļĨāļąāļāļāļēāļāļāļĩāđ User āđāļāđ Login āđāļāđāļēāļĄāļēāđāļāļĢāļ°āļāļāđāļĢāļĩāļĒāļāļĢāđāļāļĒāđāļĨāđāļ§ āļāļ User āļāļ°āļāļģāļāļīāļāļāļĢāļĢāļĄāļāđāļāđāļ āļĢāļ°āļāļāļāđāļāļģāđāļĄāđāđāļāđāđāļĨāđāļ§āļ§āđāļē User āļāļāļāļĩāđāđāļāļīāđāļāļāļ° Login āđāļāđāļēāļĄāļē
āļāđāļēāļāļĒāđāļēāļāļāļąāđāļ āđāļĢāļēāļāļ°āļāļģāļĒāļąāļāđāļāļāļąāļāļāļĩāļĨāđāļ°
āđāļĢāļēāļāđāđāļāđāļāđāļāļāļŠāđāļāļāđāļāļĄāļđāļĨāđāļāļāļāļāļĢāļ°āļāļāđāļāļāļļāļ āđ āļāļēāļĢ Request āđāļāļ·āđāļāđāļŦāđāļĢāļ°āļāļāđāļĄāđāļĨāļ·āļĄāļ§āđāļē āļāļāļāļĩāđāļŠāđāļ Request āļāļĩāđāļĄāļēāļāļ·āļ User āļāļāļāļĩāđāļāļ° āļāļĩāđāđāļāļīāđāļ Login āđāļāđāļēāļĄāļē āļāļķāđāļāļāđāļāļĄāļđāļĨāļāļĩāđāđāļĢāļēāļāļ°āļŠāđāļāđāļāļāļāļāļĢāļ°āļāļāļāļąāđāļ āđāļĢāļēāđāļĢāļĩāļĒāļāļāļĩāļāļāļĒāđāļēāļāļāļķāļāļ§āđāļē Token āđāļāļĒāđāļāļāļāļāļ§āļēāļĄāļāļĩāđāđāļĢāļēāļāļ°āļāļēāļāļļāļāļāļāđāļāļāļģāļāļ§āļēāļĄāļĢāļđāđāļāļąāļāļāļąāļ Standard Token āļāļąāļ§āļāļķāļāļāļĩāđāļāļ·āđāļāļ§āđāļē JWT āļŦāļĢāļ·āļ JSON Web Tokens
āļāļģāđāļĄāļāđāļāļāđāļāđāļ JWT (JSON Web Tokens)
JWT āļĒāđāļāļĄāļēāļāļēāļ JSON Web Tokens āđāļāđāļ Standard Token āļāļĩāđāļŠāļĢāđāļēāļāļāļēāļāļāđāļāļĄāļđāļĨāļāļāļ User āđāļāđāļĨāļ°āļāļ āļāļĩāđāļāļđāļāđāļāđāļāļāļĒāļđāđāđāļāļĢāļđāļāđāļāļ JSON

āđāļāļĒāļāļēāļāļ āļēāļāļāļ°āđāļŦāđāļāđāļāđāļ§āđāļēāļŦāļāđāļēāļāļēāļāļāļ JWT āļāļ·āļāļāđāļāļĄāļđāļĨāļāļāļ User āđāļāđāļĨāļ°āļāļāļāļĩāđāļāļđāļāđāļāđāļēāļĢāļŦāļąāļŠāđāļāđāļ Token āļĄāļĩāļāļąāđāļāļŦāļĄāļ 3 āļŠāđāļ§āļāļāđāļ§āļĒāļāļąāļ āļāļķāđāļāđāļāđāļĨāļ°āļŠāđāļ§āļāļāļ°āļāļđāļāļāļąāđāļāļāđāļ§āļĒāļŠāļąāļāļĨāļąāļāļĐāļāđāđāļāļĢāļ·āđāļāļāļŦāļĄāļēāļĒāļāļļāļ (.) āļāļĢāļ°āļāļāļāđāļāļāđāļ§āļĒ
- Header (āļŠāļĩāđāļāļ) āđāļāđāļāļāđāļāļĄāļđāļĨ Type āļāļāļ Token āđāļĨāļ°āļāđāļāļĄāļđāļĨ Algorithm āļāļĩāđāđāļāđāđāļāļāļēāļĢāđāļāđāļēāļĢāļŦāļąāļŠ-āļāļāļāļĢāļŦāļąāļŠ āđāļāđāļāļāļĒāļđāđāđāļāļĢāļđāļāđāļāļ JSON āļāļąāļāļāļąāļ§āļāļĒāđāļēāļ
{
"alg": "HS256",
"typ": "JWT"
}
āļāļēāļāđāļāļāļąāļ§āļāļĒāđāļēāļāļāđāļāļĄāļđāļĨ JSON āļāļāļ Header āļāļ°āđāļŦāđāļāļ§āđāļē Token āļāļĩāđāđāļāđāļāļāļĢāļ°āđāļ āļ JWT āđāļĨāļ°āđāļāđ Algorithm HS256 āđāļāļāļēāļĢāđāļāđāļēāļĢāļŦāļąāļŠ-āļāļāļāļĢāļŦāļąāļŠ
- Payload (āļŠāļĩāļĄāđāļ§āļ) āđāļāđāļāļāđāļāļĄāļđāļĨāļāļĩāđāđāļāđāđāļāļāļēāļĢāļĒāļ·āļāļĒāļąāļāļāļąāļ§āļāļāļāļāļ User āđāļĨāļ°āļāđāļāļĄāļđāļĨāļāļĩāđāđāļāļēāđāļ§āđāļāļģāļŦāļāļāļāļĪāļāļīāļāļĢāļĢāļĄāļāļāļ Token āđāļāđāļāļāļĒāļđāđāđāļāļĢāļđāļāđāļāļ JSON āļāļąāļāļāļąāļ§āļāļĒāđāļēāļ
{
"sub": "1234567890",
"name": "John Doe",
"iat": 1516239022
}
āļāļēāļāđāļāļāļąāļ§āļāļĒāđāļēāļāļāđāļāļĄāļđāļĨ JSON āļāļāļ Payload āļāļ°āđāļŦāđāļāļ§āđāļē Token āļāļĩāđāđāļāđāļāļāđāļāļĄāļđāļĨ Id āđāļĨāļ° Name āļāļāļ User āđāļ§āđ āđāļĨāļ°āļĒāļąāļāđāļāđāļāļāđāļāļĄāļđāļĨāđāļ§āļĨāļēāļŠāļĢāđāļēāļ Token āđāļ§āđāļāđāļ§āļĒ
- Signature (āļŠāļĩāļāđāļē) āđāļāđāļāđāļŦāļĄāļ·āļāļ Digital Signed āļāļĩāđāļĄāļĩāđāļ§āđāđāļāđāļāļāļ§āļēāļĄāļāđāļēāđāļāļ·āđāļāļāļ·āļāļāļāļ Token āđāļāļĒāđāļāļīāļāļāļēāļāļāļēāļĢāđāļāļē Payload āļāļĩāđāļāļđāļāđāļāđāļēāļĢāļŦāļąāļŠāļāđāļ§āļĒ Algorithm āļāļēāļĄāļāļĩāđāļĢāļ°āļāļļāđāļ Header āļĄāļēāļĢāļ§āļĄāđāļāđāļēāļāļąāļ Secret Key āļāļĩāđāđāļĢāļēāļāļąāđāļāļāļķāđāļāļĄāļē āļāļąāļāļāļąāļ§āļāļĒāđāļēāļ
HMACSHA256(
base64UrlEncode(header) + "." +
base64UrlEncode(payload),
your-256-bit-secret
)
āļāļēāļāđāļāļāļąāļ§āļāļĒāđāļēāļāļāđāļāļĄāļđāļĨāļāļāļ Signature āļāļ°āđāļŦāđāļāļ§āđāļē Secret Key āļāļĩāđ User āļāļąāđāļāļāļķāđāļāļāļ·āļ your-256-bit-secret āļāļąāđāļāđāļāļ
āđāļāļĒāļāļļāļāļāļāļŠāļēāļĄāļēāļĢāļāļĨāļāļāđāļāđāļēāđāļāđāļĨāđāļ āđāļāļĻāļķāļāļĐāļē āđāļĨāļ°āļāļģāļāļ§āļēāļĄāļĢāļđāđāļāļąāļāļāļąāļ JWT (JSON Web Tokens)āđāļŦāđāļāļĩāļĒāļīāđāļāļāļķāđāļāļāđāļēāļāđāļ§āđāļ https://jwt.io/ āļāļąāļāđāļāđ āđāļĢāļīāđāļĄāļāļēāļāđāļĢāļēāļĨāļāļāļāļģ Token āļāļĩāđāđāļāļ§āļēāļāđāļāļāđāļāļāļāļāļ Encoded āđāļĨāđāļ§āļĄāļēāļāļđāļāļĨāļĨāļąāļāļāđāļāļēāļāļāđāļēāļāļāļ§āļēāļāļąāļ
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJjaGFyYWN0ZXIwMSIsIm5hbWUiOiJMdW5hIEZyZXlhIiwiaWF0IjoxNjk2OTA1MDI1fQ.82YKRXah5sINkAYFEBQB1Py9ttrUB7uC7DtVoXbfkik

āļāļēāļāđāļāļāļąāļ§āļāļĒāđāļēāļ Token āđāļĄāļ·āđāļāđāļŠāđāļĨāļāđāļāđāļāļāđāļāļ Encoded āđāļĨāđāļ§ āļāļĨāļĨāļąāļāļāđāļāļāļāļāđāļāļĄāļđāļĨāļāļĩāđāļāļđāļāļāļāļāļĢāļŦāļąāļŠāļāđāļāļ°āļāļđāļāđāļŠāļāļāļāļĒāļđāđāđāļāļāļąāđāļāļāļāļ Decoded āļāļąāđāļ 3 āļŠāđāļ§āļ āđāļāđāļāļēāļāļĢāļđāļāļāļļāļāļāļ°āđāļŦāđāļāđāļāđāļāđāļāļ·āļāļ Error āļāļĩāđāļāļķāđāļāļ§āđāļē Invalid Signature āđāļĨāđāļ§āļĄāļąāļāđāļāļīāļāļāļēāļāļāļ°āđāļĢāļāļąāļāļĨāđāļ° āļāđāļēāļāļļāļāļāļāļĨāļāļāđāļāļāļđāļāļĩāđāļāđāļāļ VERIFY SIGNATURE (āļŠāļĩāļāđāļē) āļāđāļāļ°āđāļŦāđāļāļ§āđāļēāļāđāļāļĄāļđāļĨ Secret Key āļāļąāđāļāđāļĄāđāđāļāđāļāļđāļāđāļāļĨāļĩāđāļĒāļāļāļēāļĄāļāđāļāļĄāļđāļĨāļāļ·āđāļ āđ āđāļāļāđāļ§āļĒ āļāļģāđāļŦāđāđāļāļīāļ Error āđāļāļ·āđāļāļāļāļēāļāļāđāļāļĄāļđāļĨ Secret Key āđāļāļāđāļāļ VERIFY SIGNATURE āļāļąāļāļāđāļāļĄāļđāļĨ Secret Key āđāļāļĢāļŦāļąāļŠ āđāļĄāđāļāļĢāļāļāļąāļāļāļąāđāļāđāļāļ
āļāļļāļāļāļāļāļāļāļ°āđāļŦāđāļāļāļąāļāđāļĨāđāļ§āļ§āđāļē JWT āļāļĩāđāļŠāļēāļĄāļēāļĢāļāđāļāļēāļĢāļŦāļąāļŠāļĄāļēāļāļāļāļāļ§āļēāļĄāđāļāđāļāđāļēāļĒ āđ āđāļĨāļĒ āđāļĨāđāļ§āđāļāļāļāļĩāđāđāļĢāļēāļāļ§āļĢāļāļ°āđāļŠāđāļāđāļāļĄāļđāļĨāļāļ°āđāļĢāļĨāļāđāļāđāļ Payload āļāļąāļāļāļĩāļĨāđāļ° āļāļģāļāļāļāļāđāļāļ·āļ āđāļĢāļēāļāļ§āļĢāđāļāđāļāļāđāļāļĄāļđāļĨāļāļĩāđāļāđāļāļĒāļāļĩāđāļŠāļļāļāļāļĩāđāļŠāļēāļĄāļēāļĢāļāđāļāđāļĢāļ°āļāļļāļāļąāļ§āļāļāļāļāļāđāļĢāļēāđāļāđ āđāļāļĒāđāļĄāđāļāļ§āļĢāđāļāđāļāļāđāļāļĄāļđāļĨāļāļĩāđāđāļāđāļāļāļ§āļēāļĄāļĨāļąāļ āļŦāļĢāļ·āļ Password āđāļāļĒāļāļĢāļ
āļ§āļīāļāļĩāđāļāđāļāļēāļ JWT (JSON Web Tokens) āđāļāļāļēāļĢ Authentication
āļāļķāđāļāđāļāļāļąāđāļāļāļāļāļāđāļāđāļāđāļĢāļēāļāļ°āļĄāļēāļĨāļāļāđāļāļĩāļĒāļ Code āļāļģāļĢāļ°āļāļ Authentication āļāļāļ āļĢāļ°āļāļāļāļąāļāļāļēāļĢāļŠāļīāļāļāđāļē āļāđāļ§āļĒ Passport.js āđāļĨāļ° JWT āļāļĒāđāļēāļāļāđāļēāļĒāļāļąāļ
- āļāđāļāļāđāļĢāļīāđāļĄāđāļŦāđāļāļļāļāļāļāļŠāļĢāđāļēāļ Web Application āļĢāļ°āļāļāļāļąāļāļāļēāļĢāļŠāļīāļāļāđāļē āļāđāļ§āļĒ Node.js āđāļĨāļ° Express āļāļĒāđāļēāļāļāđāļēāļĒāļāļķāđāļāļĄāļēāļāļąāļāļāđāļāļ āļāļđāļĢāļđāļāđāļāļāļāļĢāđāļēāļ§ āđ āđāļāđāļāļēāļ Code āđāļāđāļāļĨāđ index.js āļāđāļēāļāļĨāđāļēāļāļāļĩāđāđāļĨāļĒ
const express = require("express");
const app = express();
const port = 5000;
let products = [
{ id: 1, name: "Laptop", category: "Electronics", price: 1000, stock: 5 },
{ id: 2, name: "Phone", category: "Electronics", price: 500, stock: 10 },
];
app.get("/products", (req, res) => {
res.status(200).json(products);
});
app.listen(port, () => {
console.log(`Example app listening on port ${port}`);
});
āļāđāļēāļāļļāļāļāļāļŠāļĢāđāļēāļ Web Application āļĢāļ°āļāļāļāļąāļāļāļēāļĢāļŠāļīāļāļāđāļē āđāļŠāļĢāđāļāđāļĨāđāļ§āļāļąāđāļāđāļĢāļēāļāđāđāļāđāļĢāļīāđāļĄāļāļģāļĢāļ°āļāļ Authentication āļāļąāļāđāļāđāđāļĨāļĒ
- āđāļĢāļīāđāļĄāļāļēāļāļāļēāļĢāļāļīāļāļāļąāđāļ Dependencies āļāļĩāđāļāļģāđāļāđāļāļāđāļāļāđāļāđ āļāđāļ§āļĒāļāļģāļŠāļąāđāļ
npm install body-parser jwt-simple passport passport-jwt âsave
- āļāđāļāļĄāļēāļāļģāļĢāļ°āļāļ Login āļāđāļēāļ API āļāļĩāđāļāļ°āļŠāļĢāđāļēāļ JWT āđāļŦāđ User āđāļāđāļāļģāļāļīāļāļāļĢāļĢāļĄāļāđāļāđāļāđāļāļĢāļ°āļāļ āđāļāļĒāđāļāļīāđāļĄ Code āļāļĩāđāļĨāļāđāļāđāļāđāļāļĨāđ index.js
const bodyParser = require("body-parser");
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: true }));
const loginUsename = (req, res, next) => {
if (req.body.username === "admin" && req.body.password === "1234") {
next();
} else {
res.send("Error: username or password is incorrect");
}
};
app.post("/login", loginUsename, (req, res) => {
res.send("User " + req.body.username + " login success");
});
- āļāļēāļāļāļąāđāļāđāļŦāđāđāļĢāļēāļĨāļāļāđāļĢāļĩāļĒāļāđāļāđ API āļāļĩāđāļāđāļēāļ Postman āđāļāļ·āđāļ Test āļĢāļ°āļāļ Login āđāļĄāļ·āđāļ User āļāļĢāļāļ username āļŦāļĢāļ·āļ password āđāļĄāđāļāļđāļāļāđāļāļ

āđāļĄāļ·āđāļ User āļāļĢāļāļ username āđāļĨāļ° password āļāļđāļāļāđāļāļ

- āļāđāļāđāļāđāļĢāļēāļāļ°āđāļāđāđāļ Code āđāļāļāļģāļŠāļąāđāļ app.post(â/loginâ) āđāļāļ·āđāļāđāļŦāđāļĢāļ°āļāļ Login āļāļāļāđāļĢāļēāļŠāđāļ JWT āļāļĩāđāļŠāļĢāđāļēāļāđāļŠāļĢāđāļāđāļĨāđāļ§āļāļĨāļąāļāđāļāļĒāļąāļ User āđāļāļĒāđāļāļŠāđāļ§āļāļāļāļāļāđāļāļĄāļđāļĨ Payload āđāļĢāļēāļāļ°āđāļŠāđāđāļāđāļ
payload = { sub: āļāđāļāļĄāļđāļĨ username, iat: āļāđāļāļĄāļđāļĨāđāļ§āļĨāļēāļāļĩāđāļŠāļĢāđāļēāļ Token āļāļĩāđ }
āļāļ°āđāļāđāđāļāđāļ Code āļāļĩāđāļāļĢāļąāļāđāļāđāđāļĨāđāļ§āđāļāđāļāļĨāđ index.js āļāļąāļāļāļĩāđ
const jwt = require("jwt-simple");
const SECRET = "USER_SECRET_KEY";
app.post("/login", loginUsename, (req, res) => {
const payload = {
sub: req.body.username,
iat: new Date().getTime(),
};
res.send(jwt.encode(payload, SECRET));
});
- āļāļģāđāļŦāđāđāļĄāļ·āđāļāđāļĢāļēāđāļĢāļĩāļĒāļāđāļāđ API āļāļĩāđāļāđāļēāļ Postman āļāļĩāļāļāļĢāļąāđāļ āļĢāļ°āļāļāļāđāļāļ°āļŠāđāļ JWT āļāļĨāļąāļāļĄāļēāđāļŦāđāđāļĢāļē

- āļāļķāđāļāđāļāļāļēāļĢāļĒāļ·āļāļĒāļąāļāļāļąāļ§āļāļāļāļąāđāļ āđāļĢāļēāļāļ°āđāļāđ Passport.js āđāļāđāļēāļĄāļēāđāļāđāļāļāļąāļ§āļāļĨāļēāļ āđāļāļĒāđāļĢāļīāđāļĄāļāļēāļāļāļēāļĢāļŠāļĢāđāļēāļāļāļĢāļ°āļāļ§āļāļāļēāļĢāļĒāļ·āļāļĒāļąāļāļāļąāļ§āļāļāļāđāļ§āļĒ JWT āļāđāļēāļ Code āđāļŦāļĨāđāļēāļāļĩāđ
const ExtractJwt = require("passport-jwt").ExtractJwt;
const JwtStrategy = require("passport-jwt").Strategy;
const jwtOptions = {
jwtFromRequest: ExtractJwt.fromHeader("authorization"),
secretOrKey: SECRET,
};
const jwtAuth = new JwtStrategy(jwtOptions, (payload, done) => {
if (payload.sub === "admin") done(null, true);
else done(null, false);
});
- āļāļēāļāļāļąāđāļāļāļģāđāļāļēāļāļĢāļ°āļāļ§āļāļāļēāļĢāļĒāļ·āļāļĒāļąāļāļāļąāļ§āļāļāļāđāļ§āļĒ JWT āļāļĩāđāļŠāļĢāđāļēāļāđāļ§āđāđāļāđāļāļ·āđāļāļĄāļāļąāļ Passport
const passport = require("passport");
passport.use(jwtAuth);
- āļŠāļļāļāļāđāļēāļĒāđāļĢāļĩāļĒāļāđāļāđ Passport āđāļāļĢāļđāļāđāļāļ Middleware āļāđāļēāļāļāļģāļŠāļąāđāļ app.get(â/productsâ) āļāļĩāđāļāļ°āđāļŠāļāļāļŠāļīāļāļāđāļēāļāļąāđāļāļŦāļĄāļāļāļĩāđāļĄāļĩāļāļĒāļđāđāđāļāļĢāļ°āļāļāļāļąāļāļāļēāļĢāļŠāļīāļāļāđāļē
const requireJWTAuth = passport.authenticate("jwt", { session: false });
app.get("/products", requireJWTAuth, (req, res) => {
res.status(200).json(products);
});
- āđāļāļĩāļĒāļāđāļāđāļāļĩāđ āļĢāļ°āļāļ Authentication āļāļāļ āļĢāļ°āļāļāļāļąāļāļāļēāļĢāļŠāļīāļāļāđāļē āļāđāđāļāđāļāļāļąāļāđāļŠāļĢāđāļāđāļĢāļĩāļĒāļāļĢāđāļāļĒ āđāļāļĒāļāļļāļāļāļāļŠāļēāļĄāļēāļĢāļāļĨāļāļ Test āđāļāđ āļāđāļēāļ Postman āđāļāđāđāļāđāļāļāļĨāļĨāļąāļāļāđāļāļąāļāļāļĩāđ
āđāļĄāļ·āđāļ user āļŠāđāļāļāļģāļĢāđāļāļāļāļ GET āļāđāļāļĄāļđāļĨāļāļēāļāļĢāļ°āļāļāđāļāļĒāđāļĄāđāđāļāđāđāļāļ token āđāļāļāđāļ§āļĒ āļĢāļ°āļāļāļāļķāļāļŠāđāļ Unauthorized āļāļĨāļąāļāļĄāļē

āđāļĄāļ·āđāļ user āļŠāđāļāļāļģāļĢāđāļāļāļāļ GET āļāđāļāļĄāļđāļĨāļāļēāļāļĢāļ°āļāļāđāļāļĒāđāļāļ token āđāļāļāđāļ§āļĒ āļĢāļ°āļāļāļāļķāļāļŠāđāļ āļāđāļāļĄāļđāļĨāļŠāļīāļāļāđāļēāļāļąāđāļāļŦāļĄāļāđāļāļĢāļ°āļāļ āļāļĨāļąāļāļĄāļē

- āļāļļāļāļāļāļŠāļēāļĄāļēāļĢāļāļāļđāļŠāļĢāļļāļ Code āļāļąāđāļāļŦāļĄāļāđāļāļāļēāļĢāļāļģāļĢāļ°āļāļ Authentication āļāļāļ āļĢāļ°āļāļāļāļąāļāļāļēāļĢāļŠāļīāļāļāđāļē āļāļĒāđāļēāļāļāđāļēāļĒ āđāļāđāļāļĩāđāļāđāļēāļāļĨāđāļēāļāļāļĩāđāđāļĨāļĒ
const express = require("express");
const bodyParser = require("body-parser");
const jwt = require("jwt-simple");
const passport = require("passport");
const app = express();
const port = 5000;
const ExtractJwt = require("passport-jwt").ExtractJwt;
const JwtStrategy = require("passport-jwt").Strategy;
const SECRET = "USER_SECRET_KEY";
const jwtOptions = {
jwtFromRequest: ExtractJwt.fromHeader("authorization"),
secretOrKey: SECRET,
};
const jwtAuth = new JwtStrategy(jwtOptions, (payload, done) => {
if (payload.sub === "admin") done(null, true);
else done(null, false);
});
passport.use(jwtAuth);
const requireJWTAuth = passport.authenticate("jwt", { session: false });
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: true }));
const loginUsename = (req, res, next) => {
if (req.body.username === "admin" && req.body.password === "1234") {
next();
} else {
res.send("Error: username or password is incorrect");
}
};
let products = [
{ id: 1, name: "Laptop", category: "Electronics", price: 1000, stock: 5 },
{ id: 2, name: "Phone", category: "Electronics", price: 500, stock: 10 },
];
app.post("/login", loginUsename, (req, res) => {
const payload = {
sub: req.body.username,
iat: new Date().getTime(),
};
res.send(jwt.encode(payload, SECRET));
});
app.get("/products", requireJWTAuth, (req, res) => {
res.status(200).json(products);
});
app.listen(port, () => {
console.log(`Example app listening on port ${port}`);
});
āļŠāļĢāļļāļ
āļāļēāļāļāļĩāđāđāļāđāļāļĨāđāļēāļ§āļĄāļēāđāļāļāđāļēāļāļāđāļāļāļļāļāļāļāļāļāļāļ°āđāļāđāļĢāļđāđāļāļąāļāđāļĨāđāļ§āļ§āđāļē āļāļēāļĢāđāļāđāļāļēāļ JWT (JSON Web Tokens) āđāļāļāļēāļĢāļāļģāļĢāļ°āļāļ Authentication āļāļąāđāļāđāļĄāđāđāļāđāđāļĢāļ·āđāļāļāļĒāļēāļāđāļĨāļĒ āļāļĩāļāļāļąāđāļāļĒāļąāļāļāļ°āļāđāļ§āļĒāđāļāļīāđāļĄāļāļ§āļēāļĄāļāļĨāļāļāļ āļąāļĒāđāļŦāđāļāļąāļāļĢāļ°āļāļāļāļāļāđāļĢāļēāđāļāļāļēāļĢāļāļĢāļ§āļāļŠāļāļāļŠāļīāļāļāļīāđāļāļēāļĢāđāļāđāļēāļāļķāļāļāđāļāļĄāļđāļĨāļāļāļ User āđāļāđāļĨāļ°āļāļ āļāđāļēāļāļāļēāļĢāđāļāđāļēāļĢāļŦāļąāļŠāļāļēāļāļāđāļāļĄāļđāļĨāļāļĩāđāđāļāđāļĒāļ·āļāļĒāļąāļāļāļąāļ§āļāļāđāļāļĢāļđāļāđāļāļ JSON āļāļĩāđāđāļāļ·āđāļāļāļ·āļāđāļāđ āđāļĨāļ°āļĄāļĩāļāļ§āļēāļĄāļāļĨāļāļāļ āļąāļĒāđāļāļĢāļ°āļāļąāļāļāļķāļāļāļĩāļāļāđāļ§āļĒ
āļāđāļāļĄāļđāļĨāļāđāļēāļāļāļīāļ
- Introduction to JSON Web Tokens āļŠāļ·āļāļāđāļāđāļĄāļ·āđāļ 9 āļāļļāļĨāļēāļāļĄ 2566 āļāļēāļ: https://jwt.io/introduction
- JSON Web Token āļĄāļēāļāļĢāļāļēāļāđāļŦāļĄāđ āđāļāļāļēāļĢāļāļģ Authentication āļŠāļ·āļāļāđāļāđāļĄāļ·āđāļ 9 āļāļļāļĨāļēāļāļĄ 2566 āļāļēāļ: https://medium.com/rootusercc/json-web-token-āļĄāļēāļāļĢāļāļēāļāđāļŦāļĄāđ-āđāļāļāļēāļĢāļāļģ-authentication-b0760dd9acd1
- āļāļģ Stateless Authentication āļāļ Express āļāđāļ§āļĒ Passport.js + JWT āļŠāļ·āļāļāđāļāđāļĄāļ·āđāļ 9 āļāļļāļĨāļēāļāļĄ 2566 āļāļēāļ: https://medium.com/@kennwuttisasiwat/āļāļģ-authentication-āļāļ-express-āļāđāļ§āļĒ-passport-js-jwt-34fb1169a410
- āļāļģāļāļ§āļēāļĄāļĢāļđāđāļāļąāļāļāļąāļ JWT (Json Web Token) āļŠāļ·āļāļāđāļāđāļĄāļ·āđāļ 9 āļāļļāļĨāļēāļāļĄ 2566 āļāļēāļ: https://www.jittagornp.me/blog/what-is-jwt/