Files
ldap-auth-service/lib/directoryApi.js
2026-08-21 10:45:31 +05:00

59 lines
1.7 KiB
JavaScript
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
'use strict';
const crypto = require('crypto');
const express = require('express');
const ldapClient = require('./ldapClient');
const adminSettings = require('./adminSettings');
const router = express.Router();
function timingSafeEqualStr(a, b) {
const ba = Buffer.from(String(a || ''));
const bb = Buffer.from(String(b || ''));
if (ba.length !== bb.length) return false;
return crypto.timingSafeEqual(ba, bb);
}
function apiKeyFromRequest(req) {
const header = String(req.headers['x-api-key'] || '');
if (header) return header;
return String(req.query.api_key || '');
}
function requireApiKey(req, res, next) {
const expected = adminSettings.getSettings().apiKey;
if (!expected) {
return res.status(503).json({
success: false,
error: 'API-ключ не настроен — сгенерируйте его в панели администратора'
});
}
const provided = apiKeyFromRequest(req);
if (!provided || !timingSafeEqualStr(provided, expected)) {
return res.status(401).json({ success: false, error: 'Неверный или отсутствующий API-ключ' });
}
next();
}
router.get('/users', requireApiKey, async (req, res) => {
try {
const users = await ldapClient.listUsers();
res.json({
success: true,
count: users.length,
users: users.map((u) => ({
login: u.login,
fio: u.full_name,
position: u.position,
phone: u.phone,
email: u.email
}))
});
} catch (err) {
const status = err.status || 500;
res.status(status).json({ success: false, error: status >= 500 ? 'Внутренняя ошибка сервера' : (err.message || 'Ошибка') });
}
});
module.exports = router;