Solucionado (ver solução)
Solucionado
(ver solução)
2
respostas

[Dúvida] Como resolver o erro HTTP 431?

Estou recebendo pelo token uma foto em jwt que nao esta renderizando

Ferramentas usadas: nextjs, typescript, next-auth, keycloak, LDAP

A imagen vem do LDAP vai para o usuário do keycloak e a minha aplicacao se encarrega de armazenar o token jwt apos a autenticacao, mas quando um usuario que tem foto a aplicacao da erro 431

Insira aqui a descrição dessa imagem para ajudar na acessibilidade

codigo do next auth:

import { get, maxHeaderSize } from "http";
import { NextAuthOptions } from "next-auth"
import KeycloakProvider from "next-auth/providers/keycloak";
import { setGlobal } from "next/dist/trace";

export const authOptions: NextAuthOptions = {
  providers: [
    KeycloakProvider({
      clientId: process.env.KC_CLIENT_ID,
      clientSecret: process.env.KC_CLIENT_SECRET,
      issuer: process.env.KC_ISSUER,
    })
  ],
  callbacks: {
    // Servidor
    jwt: async ({ token, user, profile }) => {
      const customUser = profile as unknown as any

      console.log(setGlobal(maxHeaderSize, 1000))
      if (user) {
        return {
          ...token,
          newemail: customUser.mailPrimaryAddress,
          company: customUser.company,
          group: customUser.group,
          jpegPhoto: customUser.jpegPhoto
        }
      }
      return token
    },
    // Cliente
    session: async ({ session, token }) => {
      return {

        ...session,
        user: {
          // ...token
          // newemail: token.newemail
          name: token.name,
          email: token.email,
          // // PROPS CRIADAS
          // company: token.company,
          // group: token.group,
          // jpegPhoto: token.jpegPhoto,
        }
      }
    },
  },
  events: {
    async signOut() {
      await get(ENV)
    }
  }
}

middleware:

import { NextAuthMiddlewareOptions, NextRequestWithAuth, withAuth } from "next-auth/middleware"
import { NextResponse } from "next/server"

const middleware = (request:NextRequestWithAuth) =>{
  console.log("[MIDDLEWARE_NEXTAUTH_TOKEN]: ", request.nextauth.token)

  const isPrivateRoutes = request.nextUrl.pathname.startsWith("/private/admin")
  const isAdminUser = request.nextauth.token?.group === 'admin'

  if(isPrivateRoutes && !isAdminUser){
    return NextResponse.rewrite(new URL('/denied', request.url))
  }
}
const callbackOptions:NextAuthMiddlewareOptions = {}

export default withAuth(middleware,callbackOptions)
export const config ={
  matcher: ['/private/:path*']
};

Agradeço a ajuda desde ja!!! Estou aceitando dicas e sugestões!

2 respostas
solução!

E aí, Samuel! Beleza? Então, vamos lá!

O erro HTTP 431 é geralmente relacionado ao tamanho do cabeçalho da solicitação HTTP, o que significa que tem algo muito grande ali. Aqui estão algumas dicas para tentar resolver:

Tamanho do Cabeçalho: Você mencionou que está enviando uma foto via JWT. Verifique se essa imagem não está fazendo com que o tamanho total do cabeçalho da solicitação HTTP ultrapasse o limite. Se for isso, você pode precisar considerar enviar a imagem de uma maneira diferente, como um link ou ID, em vez de incorporá-la diretamente no cabeçalho.

Configuração do Servidor: O erro pode estar relacionado à configuração do servidor ou ao limite máximo de tamanho do cabeçalho. Dependendo de onde sua aplicação está hospedada, você pode precisar ajustar as configurações do servidor para permitir cabeçalhos maiores. No entanto, tenha cuidado ao fazer isso, pois pode ter implicações de segurança.

Verifique os Logs: Parece que você já está usando console.log para registrar algumas informações. Continue fazendo isso para entender exatamente em que parte do processo o erro está ocorrendo. Pode ser útil verificar os logs do servidor para obter mais detalhes sobre o erro.

Refatore o JWT: Pode ser útil repensar como você está armazenando a imagem no JWT. Em vez de incluir a imagem inteira, considere armazenar apenas um link ou referência à imagem. Isso pode ajudar a reduzir o tamanho do JWT e evitar o erro 431.

Teste em Ambientes Diferentes: Se possível, teste sua aplicação em diferentes ambientes para ver se o erro persiste. Às vezes, certas configurações ou limitações de um ambiente específico podem causar o erro.

Boa sorte aí e qualquer coisa, é só dar um grito!

Foi resolvido localmente adicionando isso no package.json

"scripts": { "dev": "NODE_OPTIONS='--max-http-header-size=12800000' next dev", "build": "next build", "start": "NODE_OPTIONS='--max-http-header-size=12800000' next start", "lint": "next lint" },