[[:oktatas:web:back-end_framework:express|< Express]]
====== Express - Azonosítás ES ======
* **Szerző:** Sallai András
* Copyright (c) 2025, Sallai András
* Szerkesztve: 2025
* Licenc: [[https://creativecommons.org/licenses/by-sa/4.0/|CC Attribution-Share Alike 4.0 International]]
* 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.
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:
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:
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 =====
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 ====
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);