Rumah >hujung hadapan web >tutorial js >Mencipta dan Menjaga Pengesahan JWT dalam Apl Web

Mencipta dan Menjaga Pengesahan JWT dalam Apl Web

Susan Sarandon
Susan Sarandonasal
2024-11-11 11:09:03636semak imbas

Creating and Securing JWT Authentication in a Web App

pengenalan

JSON Web Token (JWT) ialah cara padat dan serba lengkap untuk menghantar maklumat dengan selamat antara pihak sebagai objek JSON. JWT digunakan secara meluas untuk mengesahkan pengguna dalam aplikasi web. Dalam tutorial ini, kami akan membina bahagian belakang Node.js dan Express dengan pengesahan JWT.

Apa itu JWT?

JWT (JSON Web Token) ialah standard terbuka untuk menghantar maklumat dengan selamat antara pihak sebagai objek JSON. Setiap token terdiri daripada tiga bahagian:

  1. Pengepala: Mengandungi maklumat tentang jenis token dan algoritma pencincangan.
  2. Muat bayar: Mengandungi maklumat dan tuntutan pengguna.
  3. Tandatangan: Mengesahkan integriti token.

Contoh JWT

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VySWQiOiIxMjM0IiwidXNlcm5hbWUiOiJqb2huZG9lIn0.H6BBiB1y5eXKXvW9bbjT2Rg8Jp4oE4Y5Kxf_sDF7Kzg

Menyediakan Projek

  1. Buat direktori projek baharu:

    mkdir jwt-auth-app
    cd jwt-auth-app
    
  2. Mulakan projek Node.js baharu:

    npm init -y
    

Memasang Ketergantungan

Pasang kebergantungan yang diperlukan:

npm install express jsonwebtoken bcryptjs dotenv express-validator
  • express: Rangka kerja web untuk Node.js.
  • jsonwebtoken: Perpustakaan untuk menjana dan mengesahkan JWT.
  • bcryptjs: Pustaka untuk mencincang kata laluan.
  • dotenv: Untuk pembolehubah persekitaran.
  • express-validator: Untuk mengesahkan data input.

Mengkonfigurasi Pelayan

Buat persediaan pelayan asas dalam server.js:

// server.js
require('dotenv').config();
const express = require('express');
const app = express();
app.use(express.json());

// Import Routes
const authRoutes = require('./routes/auth');
app.use('/api/auth', authRoutes);

const PORT = process.env.PORT || 5000;
app.listen(PORT, () => console.log(`Server running on port ${PORT}`));

Buat fail .env untuk menyimpan pembolehubah persekitaran:

PORT=5000
JWT_SECRET=your_jwt_secret_key

Mencipta Laluan Pengesahan Pengguna

  1. Buat fail route/auth.js untuk laluan pengesahan:
// routes/auth.js
const express = require('express');
const { body, validationResult } = require('express-validator');
const bcrypt = require('bcryptjs');
const jwt = require('jsonwebtoken');
const router = express.Router();

const users = []; // In-memory user storage

// Signup Route
router.post(
  '/signup',
  [
    body('username').isLength({ min: 3 }),
    body('password').isLength({ min: 5 })
  ],
  async (req, res) => {
    const errors = validationResult(req);
    if (!errors.isEmpty()) return res.status(400).json({ errors: errors.array() });

    const { username, password } = req.body;
    const hashedPassword = await bcrypt.hash(password, 10);

    users.push({ username, password: hashedPassword });
    res.status(201).json({ message: 'User registered successfully' });
  }
);

// Login Route
router.post(
  '/login',
  [
    body('username').notEmpty(),
    body('password').notEmpty()
  ],
  async (req, res) => {
    const errors = validationResult(req);
    if (!errors.isEmpty()) return res.status(400).json({ errors: errors.array() });

    const { username, password } = req.body;
    const user = users.find(u => u.username === username);

    if (!user) return res.status(400).json({ message: 'Invalid credentials' });

    const isMatch = await bcrypt.compare(password, user.password);
    if (!isMatch) return res.status(400).json({ message: 'Invalid credentials' });

    const token = jwt.sign({ username }, process.env.JWT_SECRET, { expiresIn: '1h' });
    res.json({ token });
  }
);

module.exports = router;
  1. Penjelasan Laluan
  • Laluan Pendaftaran: Mengesahkan dan mencincang kata laluan sebelum menyimpan pengguna.
  • Laluan Log Masuk: Mengesahkan bukti kelayakan, menyemak kata laluan dan mengeluarkan token JWT.

Menjana Token JWT

  • Kaedah jwt.sign menjana token yang mengandungi maklumat pengguna.
  • JWT_SECRET digunakan untuk menandatangani token, yang harus disimpan dengan selamat dan peribadi.
const token = jwt.sign({ username }, process.env.JWT_SECRET, { expiresIn: '1h' });

Mengamankan Laluan dengan JWT

Untuk melindungi laluan, cipta perisian tengah untuk mengesahkan token.

  1. Buat middleware/auth.js:
// middleware/auth.js
const jwt = require('jsonwebtoken');

module.exports = function (req, res, next) {
  const token = req.header('Authorization')?.split(' ')[1];
  if (!token) return res.status(401).json({ message: 'Access denied' });

  try {
    const decoded = jwt.verify(token, process.env.JWT_SECRET);
    req.user = decoded;
    next();
  } catch (ex) {
    res.status(400).json({ message: 'Invalid token' });
  }
};
  1. Lindungi Laluan dalam server.js:

Buat laluan dilindungi yang memerlukan token yang sah:

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VySWQiOiIxMjM0IiwidXNlcm5hbWUiOiJqb2huZG9lIn0.H6BBiB1y5eXKXvW9bbjT2Rg8Jp4oE4Y5Kxf_sDF7Kzg

Penjelasan Middleware

  • Perisian tengah menyemak kehadiran token dalam pengepala Kebenaran.
  • Jika token itu sah, maklumat pengguna ditambahkan pada objek req, membenarkan akses kepada laluan yang dilindungi.

Kesimpulan

Dalam tutorial ini, kami telah membincangkan asas menyediakan pengesahan JWT dalam bahagian belakang Node.js dan Express. Panduan ini menunjukkan:

  1. Menyediakan laluan pengesahan untuk pendaftaran dan log masuk.
  2. Mencipta dan mengesahkan token JWT.
  3. Melindungi laluan dengan perisian tengah berasaskan JWT.

JWT ialah cara yang berkuasa untuk mengendalikan pengesahan, menjadikan aplikasi web anda selamat dan berskala.

Atas ialah kandungan terperinci Mencipta dan Menjaga Pengesahan JWT dalam Apl Web. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn