Tartalomjegyzék
Express - Azonosítás ES
- Szerző: Sallai András
- Copyright © 2025, Sallai András
- Szerkesztve: 2025
- Web: https://szit.hu
Bevezetés
Az útvonalak védelmét úgy tudjuk ellátni, ha van felhasználó aki be tud jelentkezni, és sikeres bejelentkezés után kap egy tokent, amivel majd elérheti a védett útvonalakat.
Az útvonalak és a komponensek összekötésénél beállítható, hogy adott útvonalak csak akkor érhetők el, ha visszakapjuk az érvényes tokent. Ehhez egy köztes szoftvert fogunk használni a tokenek ellenőrzésére. A tokeneket sikeres bejelentkezéskor készítjük.
A példánkban a jsonwebtoken-t fogjuk használni. A token szerveroldalon keletkezik, de kliens oldalon tároljuk.
Felhasználó felvétele
User modell
A felhasználók kezeléséhez egy User nevű modellben leírjuk a felhasználóról mit tárolunk.
- app/models/user.js
import { DataTypes } from 'sequelize' import sequelize from '../database/database.js' const User = sequelize.define('users', { id: { type: DataTypes.INTEGER, primaryKey: true, autoIncrement: true }, name: { type: DataTypes.STRING }, email: { type: DataTypes.STRING }, password: { type: DataTypes.STRING } }) await sequelize.sync({ force: false }) export default User
AuthController
Az Auth kontroller helyett készíthetnék akár egy User kontrollert is, de az Auth névhez jobban illek majd a login() metódus.
Telepítsük a bcryptjs csomagot:
npm install bcryptjs
A bcryptjs a bcrypt JavaScriptre optimalizált változata.
Készítsük el az app/controllers/authcontroller.js fájlt:
- app/controllers/authcontroller.js
import bcrypt from 'bcryptjs' import User from '../models/user.js' const AuthController = { async register(req, res) { try { const { name, email, password } = req.body const hashedPassword = await bcrypt.hash(password, 10) const user = await User.create({ name, email, password: hashedPassword }) res.status(201).json(user) } catch (error) { res.status(500).json({ error: error.message }) } } } export default AuthController
Routing
Írjunk egy új útválasztó sort:
import AuthController from '../controllers/authcontroller.js' //... router.post('/register', AuthController.register)
A teljes kód:
- app/routes/api.js
import Router from 'express' const router = Router() import EmployeeController from '../controllers/employeecontroller.js' import AuthController from '../controllers/authcontroller.js' router.get('/employees', EmployeeController.index) router.post('/employees', EmployeeController.create) router.put('/employees/:id', EmployeeController.update) router.delete('/employees/:id', EmployeeController.delete) router.post('/register', AuthController.register) export default router
Teszteljük, a felhasználó regisztrálása működik.
res post localhost:8000/register name=Valaki email=valaki@zold.lan password=titok
APP_KEY
Vegyük fel a .env fájlban az APP_KEY tulajdonságot:
APP_KEY=3434384383343
Írjunk bele, legalább 32 számot és betűt.
Token ellenőrzés
- app/middleware/authjwt.js
import jwt from 'jsonwebtoken' import dotenv from 'dotenv' dotenv.config() const verifyToken = (req, res, next) => { const authData = req.headers.authorization if (!authData) { return res.status(403).json({ message: 'No token provided' }) } const token = authData.split(' ')[1] jwt.verify(token, process.env.APP_KEY, (err, decoded) => { if (err) { return res.status(401).json({ message: 'Unauthorized' }) } req.userId = decoded.id next() }) } export default verifyToken
Bejelentkezés
Az authcontroller.js-ben
- app/controllers/authcontroller.js
const jwt = require('jsonwebtoken') //... async login(req, res) { try { const { email, password } = req.body const user = await User.findOne({ where: { email } }) if (!user) { return res.status(401).json({ message: 'Invalid email or password' }) } const isPasswordValid = await bcrypt.compare(password, user.password) if (!isPasswordValid) { return res.status(401).json({ message: 'Invalid email or password' }) } const token = jwt.sign({ id: user.id }, process.env.APP_KEY) res.json({ token }) } catch (error) { res.status(500).json({ error: error.message }) } } }
Útválasztás
router.post('/login', AuthController.login)
Útvonal védelme
Útválasztás
import verifyToken from '../middleware/authjwt.js' //... router.post('/employees', [verifyToken], EmployeeController.store)
Ellenőrzés, például:
http post localhost:8000/api/employees name='Verdi Ernő' city='Szeged' -A bearer -a eyJhbG
A -a után a token írjuk, ami valójában jóval hosszabb.
Állítsuk be az update és delete műveletre is:
router.delete('/employees/:id', [verifyToken], employees.destroy); router.put('/employees/:id', [verifyToken], employees.update);