Migração para PostgreSQL multi-driver + correções de segurança
- Camada de banco unificada (src/database.js): drivers Postgres/Firebird, tradutor de SQL, suporte a schema e pool de conexões - Conexões: novo_local (Postgres externo) e firebird_local (legado) - Tela de rotas da API redesenhada (auth, params, exemplos de body) - Correções de segurança (críticos/altos/médios/baixos): XSS no chat, escalonamento de privilégio, mídia autenticada, SQL restrito a gerente, JWT sem fallback + issuer, IDOR em conversas, CORS por allowlist, rate-limit no login, limites de corpo por rota - Deploy alinhado: install.sh grava .env com PG_*, migracoes.js driver-aware Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,130 @@
|
||||
/**
|
||||
* Gera um token JWT para um usuário em uma empresa específica.
|
||||
* O token é armazenado no campo USU_TOKEN da tabela USUARIOS.
|
||||
*
|
||||
* Uso: node scripts/gerar-token-jwt.js <LOGIN> <ID_EMPRESA> [alias]
|
||||
*
|
||||
* Exemplos:
|
||||
* node scripts/gerar-token-jwt.js SUPORTE 1
|
||||
* node scripts/gerar-token-jwt.js SUPORTE 1 lajedo
|
||||
*/
|
||||
const jwt = require('jsonwebtoken');
|
||||
const db = require('../src/database');
|
||||
const authConfig = require('../src/config/auth');
|
||||
|
||||
async function main() {
|
||||
const login = process.argv[2];
|
||||
const empresaId = parseInt(process.argv[3], 10);
|
||||
const alias = process.argv[4] || 'lajedo';
|
||||
|
||||
if (!login || !empresaId) {
|
||||
console.log('Uso: node scripts/gerar-token-jwt.js <LOGIN> <ID_EMPRESA> [alias]');
|
||||
console.log('Ex: node scripts/gerar-token-jwt.js SUPORTE 1 lajedo');
|
||||
process.exit(1);
|
||||
}
|
||||
|
||||
// 1. Busca o usuário pelo login
|
||||
const users = await db.query(alias,
|
||||
`SELECT USU_CODIGO_ID, USU_NOME, USU_LOGIN, USU_EMAIL, USU_STATUS,
|
||||
USU_ACESSO_WEB, USU_TIPO, USU_TOKEN
|
||||
FROM USUARIOS WHERE USU_LOGIN = ?`,
|
||||
[login]
|
||||
);
|
||||
|
||||
if (users.length === 0) {
|
||||
console.log(`❌ Usuário "${login}" não encontrado no alias "${alias}".`);
|
||||
process.exit(1);
|
||||
}
|
||||
|
||||
const user = users[0];
|
||||
|
||||
// 2. Verifica se o usuário tem acesso à empresa
|
||||
const empresas = await db.query(alias,
|
||||
`SELECT USE_EMPRESA_ID FROM USUARIOS_EMPRESA
|
||||
WHERE USE_USUARIO_ID = ? AND USE_EMPRESA_ID = ?`,
|
||||
[user.USU_CODIGO_ID, empresaId]
|
||||
);
|
||||
|
||||
if (empresas.length === 0) {
|
||||
// Lista as empresas que o usuário tem acesso
|
||||
const allEmpresas = await db.query(alias,
|
||||
`SELECT USE_EMPRESA_ID FROM USUARIOS_EMPRESA
|
||||
WHERE USE_USUARIO_ID = ?`,
|
||||
[user.USU_CODIGO_ID]
|
||||
);
|
||||
const empresasList = allEmpresas.map(e => e.USE_EMPRESA_ID).join(', ');
|
||||
|
||||
console.log(`❌ Usuário "${login}" não tem acesso à empresa ${empresaId}.`);
|
||||
console.log(` Empresas disponíveis para este usuário: ${empresasList || 'nenhuma'}`);
|
||||
process.exit(1);
|
||||
}
|
||||
|
||||
// 3. Verifica status e permissão web
|
||||
const statusOk = user.USU_STATUS === 'A';
|
||||
const webOk = user.USU_ACESSO_WEB === 1;
|
||||
|
||||
if (!statusOk) {
|
||||
console.log(`❌ Usuário "${login}" não está ativo (status: ${user.USU_STATUS}).`);
|
||||
process.exit(1);
|
||||
}
|
||||
|
||||
if (!webOk) {
|
||||
console.log(`⚠️ Usuário "${login}" não tem acesso WEB habilitado.`);
|
||||
console.log(` Execute: node scripts/habilitar-acesso-web.js ${login} ${alias}`);
|
||||
// Não impede de gerar o token, mas avisa
|
||||
}
|
||||
|
||||
// 4. Gera o payload do token
|
||||
const payload = {
|
||||
id: user.USU_CODIGO_ID,
|
||||
empresaId: empresaId,
|
||||
nome: user.USU_NOME.trim(),
|
||||
login: user.USU_LOGIN.trim(),
|
||||
email: user.USU_EMAIL ? user.USU_EMAIL.trim() : null,
|
||||
tipo: user.USU_TIPO ? user.USU_TIPO.trim() : null,
|
||||
alias: alias,
|
||||
};
|
||||
|
||||
// 5. Gera o token JWT
|
||||
const token = jwt.sign(payload, authConfig.secret, {
|
||||
expiresIn: authConfig.expiresIn,
|
||||
issuer: authConfig.issuer,
|
||||
});
|
||||
|
||||
// 6. Armazena no campo USU_TOKEN
|
||||
await db.execute(alias,
|
||||
'UPDATE USUARIOS SET USU_TOKEN = ? WHERE USU_CODIGO_ID = ?',
|
||||
[token, user.USU_CODIGO_ID]
|
||||
);
|
||||
|
||||
// 7. Exibe o resultado
|
||||
console.log('');
|
||||
console.log('='.repeat(70));
|
||||
console.log(' ✅ TOKEN JWT GERADO COM SUCESSO');
|
||||
console.log('='.repeat(70));
|
||||
console.log('');
|
||||
console.log(` Alias: ${alias}`);
|
||||
console.log(` Usuário: ${user.USU_NOME.trim()} (${user.USU_LOGIN.trim()})`);
|
||||
console.log(` ID Usuário: ${user.USU_CODIGO_ID}`);
|
||||
console.log(` Empresa: ${empresaId}`);
|
||||
console.log(` Status: ${statusOk ? '✅ Ativo' : '❌ Inativo'}`);
|
||||
console.log(` Acesso Web: ${webOk ? '✅ Sim' : '❌ Não'}`);
|
||||
console.log('');
|
||||
console.log(' ┌─ TOKEN ─────────────────────────────────────────────────┐');
|
||||
console.log(` │ ${token}`);
|
||||
console.log(' └─────────────────────────────────────────────────────────┘');
|
||||
console.log('');
|
||||
console.log(' Expira em: ' + authConfig.expiresIn);
|
||||
console.log('');
|
||||
console.log(' 📌 Headers para usar nas requisições:');
|
||||
console.log(' Authorization: Bearer ' + token.substring(0, 50) + '...');
|
||||
console.log(' X-Usu-Token: ' + token.substring(0, 50) + '...');
|
||||
console.log('');
|
||||
|
||||
process.exit(0);
|
||||
}
|
||||
|
||||
main().catch(err => {
|
||||
console.error('Erro:', err.message);
|
||||
process.exit(1);
|
||||
});
|
||||
Reference in New Issue
Block a user