import jwt from 'jsonwebtoken';
import bcrypt from 'bcryptjs';
import { hasPermission, requirePermission, ROLES } from './permissions.js';
// JWT Secret - Environment variable'dan okunuyor
const JWT_SECRET = process.env.JWT_SECRET || 'your-super-secret-jwt-key-change-this-in-production';
const JWT_EXPIRES_IN = process.env.JWT_EXPIRES_IN || '24h';
/**
* JWT token oluşturur
*/
export function generateToken(userId, email, role) {
return jwt.sign(
{
userId,
email,
role,
iat: Math.floor(Date.now() / 1000)
},
JWT_SECRET,
{ expiresIn: JWT_EXPIRES_IN }
);
}
/**
* JWT token doğrular
*/
export function verifyToken(token) {
try {
return jwt.verify(token, JWT_SECRET);
} catch (error) {
throw new Error('Geçersiz token');
}
}
/**
* Şifreyi hash'ler
*/
export async function hashPassword(password) {
const saltRounds = 10;
return await bcrypt.hash(password, saltRounds);
}
/**
* Şifreyi doğrular
*/
export async function comparePassword(password, hashedPassword) {
return await bcrypt.compare(password, hashedPassword);
}
/**
* Token'dan kullanıcı bilgilerini çıkarır
*/
export function extractUserFromToken(token) {
try {
const decoded = verifyToken(token);
return {
userId: decoded.userId,
email: decoded.email,
role: decoded.role
};
} catch (error) {
return null;
}
}
/**
* Token ile yetki kontrolü yapar
*/
export function checkPermissionWithToken(token, permission) {
const user = extractUserFromToken(token);
if (!user) {
throw new Error('Geçersiz token');
}
if (!hasPermission(user.role, permission)) {
throw new Error(`Bu işlem için '${permission}' yetkisine sahip değilsiniz`);
}
return user;
}
/**
* Kullanıcı rolünü validate eder
*/
export function validateRole(role) {
const validRoles = Object.values(ROLES);
return validRoles.includes(role);
}