FEAT: Implementar proteção de rotas e redirecionamento para login, além de melhorias na gestão de sessão

This commit is contained in:
Gabriel Amancio 2025-10-20 10:04:41 -03:00
parent d1623af10b
commit 986e37bf51
2 changed files with 35 additions and 4 deletions

34
app.js
View File

@ -24,9 +24,9 @@ function createApp() {
app.set("trust proxy", 1);
app.use(cors());
app.use(express.static(path.join(__dirname, "public")));
app.use(express.json());
// session TEM que vir antes das rotas que usam req.session
app.use(
session({
secret: process.env.SESSION_SECRET || "change-me",
@ -34,12 +34,42 @@ function createApp() {
saveUninitialized: false,
cookie: {
maxAge: 24 * 60 * 60 * 1000,
secure: process.env.NODE_ENV === "production", // true em produção HTTPS
secure: process.env.NODE_ENV === "production",
sameSite: "lax",
},
})
);
// redirect raiz para /login
app.get("/", (req, res) => {
return res.redirect("/login");
});
// middleware que protege rotas que exigem login
function requireAuth(req, res, next) {
if (req.session && req.session.user) return next();
// se for chamada XHR, responda 401 em vez de redirect (útil para API)
if (req.xhr || req.headers.accept?.includes("application/json")) {
return res.status(401).json({ error: "not_authenticated" });
}
return res.redirect("/login");
}
// monta rotas de autenticação públicas
app.use("/", authRoutes);
// servir /public APENAS quando autenticado
app.use("/public", requireAuth, express.static(path.join(__dirname, "public")));
// proteger demais rotas (ex.: /upload, /consulta)
app.use((req, res, next) => {
// permissão liberada para rotas de auth já tratadas; proteger o resto
if (req.path.startsWith("/auth") || req.path === "/login") return next();
return requireAuth(req, res, next);
});
/////////////////////////////////////////////////////
async function getMinDistance(lat, lon) {
// tenta várias vezes com backoff exponencial; trata 429 usando Retry-After se disponível
let attempt = 0;

View File

@ -21,11 +21,12 @@ router.get("/auth/callback", async (req, res) => {
try {
const tokens = await getTokenFromCode(code);
// garante que exista req.session e sempre grava tokens
// assegura sessão e marca usuário como autenticado
if (!req.session) req.session = {};
req.session.tokens = tokens;
req.session.user = { authenticated: true }; // flag simples; adicione info real se quiser
// salva a sessão antes de redirecionar para evitar perda em stores assíncronas
// salva session antes do redirect
req.session.save((err) => {
if (err) {
console.error("[auth callback] erro ao salvar sessão:", err);