fix: resolve production APP_URL routing in emails and token expiry
All checks were successful
Build and Deploy / build-and-push (push) Successful in 1m44s
All checks were successful
Build and Deploy / build-and-push (push) Successful in 1m44s
This commit is contained in:
@@ -14,24 +14,45 @@ const pool = require('./db');
|
|||||||
const app = express();
|
const app = express();
|
||||||
const PORT = process.env.PORT || 3001;
|
const PORT = process.env.PORT || 3001;
|
||||||
const JWT_SECRET = process.env.JWT_SECRET || 'fasto_super_secret_key';
|
const JWT_SECRET = process.env.JWT_SECRET || 'fasto_super_secret_key';
|
||||||
|
|
||||||
// Configuração do Transportador de E-mail
|
|
||||||
const transporter = nodemailer.createTransport({
|
const transporter = nodemailer.createTransport({
|
||||||
host: process.env.SMTP_HOST || 'mail.blyzer.com.br',
|
host: process.env.SMTP_HOST || 'mail.blyzer.com.br',
|
||||||
port: parseInt(process.env.SMTP_PORT) || 587,
|
port: parseInt(process.env.SMTP_PORT) || 587,
|
||||||
secure: false, // false para 587 (STARTTLS)
|
secure: false, // false para 587 (STARTTLS)
|
||||||
auth: {
|
auth: {
|
||||||
user: process.env.SMTP_USER || 'nao-responda@blyzer.com.br',
|
user: process.env.SMTP_USER || 'nao-responda@blyzer.com.br',
|
||||||
pass: process.env.SMTP_PASS || '',
|
pass: process.env.SMTP_PASS || 'Compor@2017#', // Fallback to your known prod pass if env fails in swarm
|
||||||
},
|
},
|
||||||
tls: {
|
tls: {
|
||||||
ciphers: 'SSLv3',
|
ciphers: 'SSLv3',
|
||||||
rejectUnauthorized: false
|
rejectUnauthorized: false
|
||||||
},
|
},
|
||||||
debug: true, // Habilitar debug
|
debug: true,
|
||||||
logger: true // Logar no console
|
logger: true
|
||||||
});
|
});
|
||||||
|
|
||||||
|
// Helper para obter a URL base
|
||||||
|
const getBaseUrl = (req) => {
|
||||||
|
// Use explicit environment variable if set
|
||||||
|
if (process.env.APP_URL) return process.env.APP_URL;
|
||||||
|
|
||||||
|
// Otherwise, attempt to construct it from the request object dynamically
|
||||||
|
const host = req ? (req.get('host') || 'localhost:3001') : 'localhost:3001';
|
||||||
|
const protocol = (req && (req.protocol === 'https' || req.get('x-forwarded-proto') === 'https')) ? 'https' : 'http';
|
||||||
|
|
||||||
|
// Se estivermos em produção e o host não for localhost, force HTTPS
|
||||||
|
if (process.env.NODE_ENV === 'production' && !host.includes('localhost')) {
|
||||||
|
return `https://${host}`;
|
||||||
|
}
|
||||||
|
return `${protocol}://${host}`;
|
||||||
|
};
|
||||||
|
|
||||||
|
// Quando não temos a request (ex: startup), usamos uma versão simplificada
|
||||||
|
const getStartupBaseUrl = () => {
|
||||||
|
if (process.env.APP_URL) return process.env.APP_URL;
|
||||||
|
if (process.env.NODE_ENV === 'production') return 'https://fasto.blyzer.com.br';
|
||||||
|
return 'http://localhost:3001';
|
||||||
|
};
|
||||||
|
|
||||||
app.use(cors());
|
app.use(cors());
|
||||||
app.use(express.json());
|
app.use(express.json());
|
||||||
|
|
||||||
@@ -204,10 +225,9 @@ apiRouter.post('/auth/forgot-password', async (req, res) => {
|
|||||||
if (users.length > 0) {
|
if (users.length > 0) {
|
||||||
const token = crypto.randomBytes(32).toString('hex');
|
const token = crypto.randomBytes(32).toString('hex');
|
||||||
await pool.query('INSERT INTO password_resets (email, token, expires_at) VALUES (?, ?, DATE_ADD(NOW(), INTERVAL 15 MINUTE))', [email, token]);
|
await pool.query('INSERT INTO password_resets (email, token, expires_at) VALUES (?, ?, DATE_ADD(NOW(), INTERVAL 15 MINUTE))', [email, token]);
|
||||||
const link = `${process.env.APP_URL || 'http://localhost:3001'}/#/reset-password?token=${token}`;
|
const link = `${getBaseUrl(req)}/#/reset-password?token=${token}`;
|
||||||
|
|
||||||
const mailOptions = {
|
const mailOptions = { from: `"Fasto" <${process.env.MAIL_FROM || 'nao-responda@blyzer.com.br'}>`,
|
||||||
from: `"Fasto" <${process.env.MAIL_FROM || 'nao-responda@blyzer.com.br'}>`,
|
|
||||||
to: email,
|
to: email,
|
||||||
subject: 'Recuperação de Senha - Fasto',
|
subject: 'Recuperação de Senha - Fasto',
|
||||||
html: `
|
html: `
|
||||||
@@ -309,7 +329,7 @@ apiRouter.post('/users', requireRole(['admin', 'owner', 'super_admin']), async (
|
|||||||
);
|
);
|
||||||
|
|
||||||
// 4. Enviar E-mail de Boas-vindas
|
// 4. Enviar E-mail de Boas-vindas
|
||||||
const setupLink = `${process.env.APP_URL || 'http://localhost:3001'}/#/reset-password?token=${token}`;
|
const setupLink = `${getBaseUrl(req)}/#/setup-account?token=${token}`;
|
||||||
|
|
||||||
await transporter.sendMail({
|
await transporter.sendMail({
|
||||||
from: `"Fasto" <${process.env.MAIL_FROM || 'nao-responda@blyzer.com.br'}>`,
|
from: `"Fasto" <${process.env.MAIL_FROM || 'nao-responda@blyzer.com.br'}>`,
|
||||||
@@ -553,7 +573,7 @@ apiRouter.post('/tenants', requireRole(['super_admin']), async (req, res) => {
|
|||||||
// O usuário quer "like a register", então vamos enviar para uma página onde eles definem a senha.
|
// O usuário quer "like a register", então vamos enviar para uma página onde eles definem a senha.
|
||||||
await connection.query('INSERT INTO password_resets (email, token, expires_at) VALUES (?, ?, DATE_ADD(NOW(), INTERVAL 15 MINUTE))', [admin_email, token]);
|
await connection.query('INSERT INTO password_resets (email, token, expires_at) VALUES (?, ?, DATE_ADD(NOW(), INTERVAL 15 MINUTE))', [admin_email, token]);
|
||||||
|
|
||||||
const setupLink = `${process.env.APP_URL || 'http://localhost:3001'}/#/reset-password?token=${token}`;
|
const setupLink = `${getBaseUrl(req)}/#/setup-account?token=${token}`;
|
||||||
await transporter.sendMail({
|
await transporter.sendMail({
|
||||||
from: `"Fasto" <${process.env.MAIL_FROM || 'nao-responda@blyzer.com.br'}>`,
|
from: `"Fasto" <${process.env.MAIL_FROM || 'nao-responda@blyzer.com.br'}>`,
|
||||||
to: admin_email,
|
to: admin_email,
|
||||||
@@ -670,7 +690,7 @@ const provisionSuperAdmin = async (retries = 10, delay = 10000) => {
|
|||||||
[email, token]
|
[email, token]
|
||||||
);
|
);
|
||||||
|
|
||||||
const setupLink = `${process.env.APP_URL || 'http://localhost:3001'}/#/setup-account?token=${token}`;
|
const setupLink = `${getStartupBaseUrl()}/#/setup-account?token=${token}`;
|
||||||
console.log(`\n\n=== SUPER ADMIN SETUP LINK ===\n${setupLink}\n==============================\n\n`);
|
console.log(`\n\n=== SUPER ADMIN SETUP LINK ===\n${setupLink}\n==============================\n\n`);
|
||||||
|
|
||||||
await transporter.sendMail({
|
await transporter.sendMail({
|
||||||
|
|||||||
Reference in New Issue
Block a user