Mencipta dan Menjaga Pengesahan JWT dalam Apl Web

Susan Sarandon
Lepaskan: 2024-11-11 11:09:03
asal
573 orang telah melayarinya

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
Salin selepas log masuk
Salin selepas log masuk

Menyediakan Projek

  1. Buat direktori projek baharu:

    mkdir jwt-auth-app
    cd jwt-auth-app
    
    Salin selepas log masuk
  2. Mulakan projek Node.js baharu:

    npm init -y
    
    Salin selepas log masuk

Memasang Ketergantungan

Pasang kebergantungan yang diperlukan:

npm install express jsonwebtoken bcryptjs dotenv express-validator
Salin selepas log masuk
  • 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}`));
Salin selepas log masuk

Buat fail .env untuk menyimpan pembolehubah persekitaran:

PORT=5000
JWT_SECRET=your_jwt_secret_key
Salin selepas log masuk

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;
Salin selepas log masuk
  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' });
Salin selepas log masuk

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' });
  }
};
Salin selepas log masuk
  1. Lindungi Laluan dalam server.js:

Buat laluan dilindungi yang memerlukan token yang sah:

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VySWQiOiIxMjM0IiwidXNlcm5hbWUiOiJqb2huZG9lIn0.H6BBiB1y5eXKXvW9bbjT2Rg8Jp4oE4Y5Kxf_sDF7Kzg
Salin selepas log masuk
Salin selepas log masuk

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!

sumber:dev.to
Kenyataan Laman Web ini
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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan