Executando verificação de segurança...
2

Mas em outra parte do sistema, eu preciso do meu token para extrair uma informação para popular meu banco de dados, como funciona essa comunicação sem se perder nos conceitos do DDD?

Não sei como você está modelando esse sistema, mas o token de autenticação não deveria ser usado pelo que acontece para "trás" da autenticação.

Se for um sistema de pedidos por exemplo, o processo do pedido deve receber um usuário, ou a matricula/id dele para realizar sua operações internas. E não o token de autenticação.

Carregando publicação patrocinada...
1

Vamos supor que tenho que eu tenha a parte dos pedidos, para salvar no banco eu preciso do ID do usuário que está no token. Faz sentindo o front enviar essa informação do que eu extrair do token?

3

Não sei quais tecnologias você está usando no seu projeto, vou dar um exemplo de um projeto que estou atuando nesse momento em Node, Express e TypeScript. Apesar dele não estar centrado no DDD.


Tenho um types.d.ts no diretório src para indicar ao TypeScript que estou adicionando uma propriedade aos tipos existentes do Express.

declare namespace Express {
  export interface Request {
    userId: number;    
  }

  export interface JwtPayload {
    userId: number;
  }
}

Meu middleware de autenticação, vai validar o token, e em caso de sucesso ele trata e define o userId na requisição.

export const authMiddleware = (
  req: Request,
  res: Response,
  next: NextFunction
): Response | NextFunction | void => {
  if (req.path === '/login' || req.path === '/refresh-token') {
    next();
  } else {
    let token = req.headers['x-access-token'] as string;

    if (!token) {
        return res.sendStatus(403);
     }
    
    const secret = process.env.JWT_SECRET || 'secret';

    try {
      const decoded = jwt.verify(token, secret) as jwt.JwtPayload;

      req.userId = decoded.userId;
      next();
    } catch (error) {
      return res.sendStatus(401);
    }
  }
};

Ou seja, da autentição em diante eu não preciso do token para nada.
Aí posso usar o userId conforme necessário.

router.get(`/relatorios/:tipo`, async (req: Request, res: Response) => {
    const matricula = req.userId;    
    // Restante do código aqui
});

Veja, esse é um exemplo simples, é claro que no decorrer desse projeto existem outras validações em cima dessa informação. Mas o core da sua aplicação não pode depender do que acontece na camada HTTP, nesse caso eu me refiro ao JWT.

Se você criar um CLI para tarefas administrativas por exemplo, se houver autenticação pode ser que seja diferente, e a camada de autenticação dessa interface CLI tem que traduzir essa autenticação em um userId.

Sua camada de negócio vai receber um userId, como isso chegou lá não é de interesse dessa camada. Captou?