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?