71 lines
1.9 KiB
JavaScript
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
|
|
|