< Express

Express - Azonosítás ES

Szerző: Sallai András

Copyright © 2025, Sallai András

Szerkesztve: 2025

Licenc: 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

const { verifyToken } = require('../middleware/authjwt'); //... 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);