Files
B2BCall-dialer/apps/frontend/src/app/api/login/route.ts
Matheus 5c23b105b3 feat(auth): aumenta sessão web pra 12h (pedido do usuário: call center, agente não pode cair no meio do turno)
Access token JWT (packages/auth/src/tokens.ts) e o teto absoluto do cookie
de sessão (duplicado em login/post-login/select-tenant/middleware) subiram
de 15min/8h pra 12h. O refresh silencioso do middleware continua existindo
e deslizando a sessão pra frente a cada requisição — 12h agora é só o teto
de segurança pra quando esse refresh falhar (aba parada, logout em outro
lugar), não o intervalo real de renovação.

Verificado com login real: token decodificado mostra exp-iat = 12h exatas.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01BFaBaBSQGhyXGEgtTYZGV8
2026-08-31 12:48:33 -03:00

41 lines
1.7 KiB
TypeScript

import { NextResponse } from "next/server";
import { API_BASE_URL } from "@/lib/api";
import { sessionCookieName } from "@/lib/session";
export async function POST(request: Request) {
const { email, password } = await request.json();
const res = await fetch(`${API_BASE_URL}/auth/login`, {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({ email, password }),
cache: "no-store",
});
if (!res.ok) {
const body = await res.json().catch(() => ({ message: "Falha ao entrar" }));
return NextResponse.json({ message: body.message ?? "Falha ao entrar" }, { status: res.status });
}
const data = await res.json();
// Sessão gravada mesmo com senha pendente de troca (secao 199) — só dá
// pra chamar POST /auth/change-password autenticado, então o cookie
// precisa existir antes de mandar pra /trocar-senha. `mustChangePassword`
// devolvido aqui é só o sinal pro client escolher a próxima tela.
const response = NextResponse.json({ ok: true, mustChangePassword: Boolean(data.mustChangePassword) });
response.cookies.set(sessionCookieName(), JSON.stringify({ accessToken: data.accessToken, refreshToken: data.refreshToken }), {
httpOnly: true,
sameSite: "lax",
secure: process.env.NODE_ENV === "production",
path: "/",
// Call center: turno de agente pode passar de 8h — 12h é o teto
// absoluto do cookie mesmo com o refresh silencioso do middleware
// deslizando ele pra frente a cada requisição (o mesmo valor está
// duplicado em post-login/route.ts, select-tenant/actions.ts e
// middleware.ts — os 4 precisam ficar em sincronia).
maxAge: 60 * 60 * 12,
});
return response;
}