Menu
@dexcode/helpers
createProxy
proxy do Next.js que protege as rotas do app: verifica se a rota é pública, se existe token, se ele não expirou e se o usuário tem acesso ao sistema.Uso com Keycloak
Crie o arquivo src/proxy.ts (mesmo nível da pasta app):
import { createProxy } from "@dexcode/helpers";
export const proxy = createProxy({
typeSystemAuth: "keycloak",
system: "dexcode-system",
tokenCookieName: "access_token",
loginUrl: "/login",
publicRoutes: ["/", "/auth/*", "/produtos/*"],
});
export const config = {
// Não roda o proxy em arquivos estáticos e internos do Next
matcher: ["/((?!_next/static|_next/image|favicon.ico|.*\\.(?:svg|png|jpg|jpeg|gif|webp|ico)$).*)"],
};Com "keycloak", o acesso é liberado quando o token tem o sistema em resource_access:
"resource_access": {
"dexcode-system": {
"roles": ["Cliente"]
}
}O config com o matcher precisa ficar no seu proxy.ts, escrito como valor literal. O Next lê esse valor no build sem executar o código, então ele não pode vir de dentro da biblioteca.
Uso personalizado
Para tokens que não são do Keycloak, use "personalizado" e informe a regra de acesso em hasSystemAccess:
import { createProxy } from "@dexcode/helpers";
export const proxy = createProxy({
typeSystemAuth: "personalizado",
system: "meu-sistema",
tokenCookieName: "token",
loginUrl: "https://login.exemplo.com",
hasSystemAccess: (payload, system) =>
Array.isArray(payload.systems) && payload.systems.includes(system),
});Ordem das verificações
- 1Rota está em publicRoutes → Libera o acesso.
- 2Não há token no cookie tokenCookieName → Redireciona para loginUrl.
- 3Token malformado ou expirado (exp) → Apaga o cookie e redireciona para loginUrl.
- 4Usuário sem acesso ao system → Redireciona para forbiddenUrl ou responde 403.
- 5Passou em tudo → Libera o acesso.
Opções
| Prop | Tipo | Padrão | Descrição |
|---|---|---|---|
| typeSystemAuth* | "keycloak" | "personalizado" | — | Como verificar o acesso ao sistema. "personalizado" exige hasSystemAccess. |
| system* | string | — | Sistema que o usuário precisa acessar. No Keycloak é o client em resource_access. |
| tokenCookieName* | string | — | Nome do cookie onde está o token JWT. |
| loginUrl* | string | — | Destino quando não há token ou ele é inválido/expirado. Aceita URL relativa ou absoluta. |
| publicRoutes | string[] | [] | Rotas liberadas sem login. "/produtos/*" libera /produtos e tudo abaixo dele. |
| forbiddenUrl | string | 403 | Destino quando o usuário não tem acesso ao sistema. Sem ela, responde 403 Forbidden. |
| clockSkewSeconds | number | 0 | Margem em segundos para considerar o token expirado antes do exp. |
| hasSystemAccess | (payload, system) => boolean | — | Só com "personalizado" (e obrigatória nele): regra própria de acesso ao sistema. |
Se system, tokenCookieName ou loginUrl vierem vazios (por exemplo, uma variável de ambiente que não existe), o createProxy lança um erro dizendo qual está faltando.
Segurança
O proxy apenas decodifica o token. A assinatura não é validada, então um token forjado com exp no futuro passaria. Use o proxy para redirecionar o usuário e sempre valide o token de verdade no backend.