Felhasználói eszközök

Eszközök a webhelyen


oktatas:web:back-end_framework:express:azonositas_es

< Express

Express - Azonosítás ES

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);
oktatas/web/back-end_framework/express/azonositas_es.txt · Utolsó módosítás: 2025/07/27 21:31 szerkesztette: admin