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.set("trust proxy", 1);
|
||||||
|
|
||||||
app.use(cors());
|
app.use(cors());
|
||||||
app.use(express.static(path.join(__dirname, "public")));
|
|
||||||
app.use(express.json());
|
app.use(express.json());
|
||||||
|
|
||||||
|
// session TEM que vir antes das rotas que usam req.session
|
||||||
app.use(
|
app.use(
|
||||||
session({
|
session({
|
||||||
secret: process.env.SESSION_SECRET || "change-me",
|
secret: process.env.SESSION_SECRET || "change-me",
|
||||||
@ -34,12 +34,42 @@ function createApp() {
|
|||||||
saveUninitialized: false,
|
saveUninitialized: false,
|
||||||
cookie: {
|
cookie: {
|
||||||
maxAge: 24 * 60 * 60 * 1000,
|
maxAge: 24 * 60 * 60 * 1000,
|
||||||
secure: process.env.NODE_ENV === "production", // true em produção HTTPS
|
secure: process.env.NODE_ENV === "production",
|
||||||
sameSite: "lax",
|
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) {
|
async function getMinDistance(lat, lon) {
|
||||||
// tenta várias vezes com backoff exponencial; trata 429 usando Retry-After se disponível
|
// tenta várias vezes com backoff exponencial; trata 429 usando Retry-After se disponível
|
||||||
let attempt = 0;
|
let attempt = 0;
|
||||||
|
|||||||
@ -21,11 +21,12 @@ router.get("/auth/callback", async (req, res) => {
|
|||||||
try {
|
try {
|
||||||
const tokens = await getTokenFromCode(code);
|
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 = {};
|
if (!req.session) req.session = {};
|
||||||
req.session.tokens = tokens;
|
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) => {
|
req.session.save((err) => {
|
||||||
if (err) {
|
if (err) {
|
||||||
console.error("[auth callback] erro ao salvar sessão:", err);
|
console.error("[auth callback] erro ao salvar sessão:", err);
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user