DexCode Packages
Menu

@dexcode/helpers

createProxy

Cria a função 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):

src/proxy.ts
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:

payload do token
"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:

src/proxy.ts
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

  1. 1Rota está em publicRoutes → Libera o acesso.
  2. 2Não há token no cookie tokenCookieName → Redireciona para loginUrl.
  3. 3Token malformado ou expirado (exp) → Apaga o cookie e redireciona para loginUrl.
  4. 4Usuário sem acesso ao system → Redireciona para forbiddenUrl ou responde 403.
  5. 5Passou em tudo → Libera o acesso.

Opções

PropTipoPadrãoDescriçã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.
publicRoutesstring[][]Rotas liberadas sem login. "/produtos/*" libera /produtos e tudo abaixo dele.
forbiddenUrlstring403Destino quando o usuário não tem acesso ao sistema. Sem ela, responde 403 Forbidden.
clockSkewSecondsnumber0Margem 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.