Files
tcg-collectors-server/routes/auth.js
T

71 lines
1.9 KiB
JavaScript

import express from 'express'
const { Pool } = require('pg')
import jwt from 'jsonwebtoken'
import bcrypt from 'bcryptjs'
const router = express.Router()
// Database connection pool
const pool = new Pool({
user: process.env.DB_USER,
host: process.env.DB_HOST,
database: process.env.DB_NAME,
password: process.env.DB_PASS,
port: process.env.DB_PORT,
})
// Route to handle login and issue JWT token
router.post('/login', async (req, res) => {
const { username, password } = req.body
try {
const client = await pool.connect()
const queryText = 'SELECT * FROM users WHERE username = $1'
const result = await client.query(queryText, [username])
if (!result.rows.length) {
return res.status(401).json({ message: 'Invalid credentials' })
}
const user = result.rows[0]
// Compare passwords
const passwordMatch = await bcrypt.compare(password, user.password)
if (!passwordMatch) {
return res.status(401).json({ message: 'Invalid credentials' })
}
// Issue JWT token
const token = jwt.sign({ id: user.id, username: user.username }, process.env.JWT_SECRET, { expiresIn: '1h' })
res.json({ token })
} catch (error) {
console.error(error)
res.status(500).json({ message: 'Internal server error' })
}
})
// Route to refresh JWT token
router.post('/refresh-token', async (req, res) => {
const { refreshToken } = req.body
if (!refreshToken) {
return res.status(401).json({ message: 'Refresh token is required' })
}
try {
// Verify the refresh token
const decoded = jwt.verify(refreshToken, process.env.JWT_SECRET)
// Create a new access token (JWT)
const token = jwt.sign({ id: decoded.id, username: decoded.username }, process.env.JWT_SECRET, { expiresIn: '1h' })
res.json({ token })
} catch (error) {
console.error(error)
res.status(403).json({ message: 'Invalid refresh token' })
}
})
export default router