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:
parent
d1623af10b
commit
986e37bf51
34
app.js
34
app.js
@ -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;
|
||||
|
||||
@ -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);
|
||||
|
||||
Loading…
Reference in New Issue
Block a user