diff --git a/src/modules/auth/auth.controller.ts b/src/modules/auth/auth.controller.ts index edc4dc0..7910f17 100644 --- a/src/modules/auth/auth.controller.ts +++ b/src/modules/auth/auth.controller.ts @@ -103,6 +103,43 @@ export class AuthController { } + @Post('sign-out') + @HttpCode(HttpStatus.NO_CONTENT) + async signOut( + @Language() language: LanguageEnum, + @Res() res: Response, + ) { + try { + this.logger.info('/auth - SignOut'); + const exp = 1000 * 60 * 3; + + res.cookie('ddf-auth', '', { + domain: 'dadosfera.local', + maxAge: Date.now() - exp, + expires: new Date(), + httpOnly: true, + secure: true, + sameSite: 'none', // Necessário para cookies em requisições cross-site + }); + + res.cookie('ddf-refresh-auth', '', { + domain: 'dadosfera.local', + maxAge: Date.now() - exp, + expires: new Date(), + httpOnly: true, + secure: true, + sameSite: 'none', // Necessário para cookies em requisições cross-site + }); + + this.logger.info('Clean cookie sessions'); + + return res.send(); + } catch (error) { + this.logger.error('/auth - SignIn - ERROR', error); + } + + } + @Post('refresh-access-token') @HttpCode(HttpStatus.OK) @ApiOkResponse({ type: AuthRefreshAccessTokenRes }) @@ -437,18 +474,20 @@ export class AuthController { @Get('me') async getMe(@Req() req: Request, @Res() res: Response) { + this.logger.info('GET /auth/me ') // Lê cookies const accessToken = req.cookies['ddf-auth']; - const refreshToken = req.cookies['ddf-refresh-auth']; + let customerName = ''; - console.log(req.cookies) + this.logger.info('Has cookie: ' + Boolean(accessToken)) let payload: any; let userInfo: any = {}; try { // Decodifica e valida o JWT de acesso const decoded: any = accessToken && jwt.decode(accessToken, { complete: true }); - if (!decoded) throw new Error('Invalid token'); + if (!decoded) throw new Error('Invalid token') const { kid } = decoded.header; + customerName = decoded.payload.customer_name; // Busca a chave pública const { keys } = await this.authClient.getPublicKeys(); const pemValue = keys.find((k) => k.kid === kid)?.pem; @@ -466,14 +505,24 @@ export class AuthController { }; return res.status(200).json(userInfo); } catch (err) { + this.logger.error(err.message); + const refreshToken = req.cookies['ddf-refresh-auth']; + + this.logger.info('Token is invalid') + this.logger.info('Has Refresh Token: '+ Boolean(refreshToken)) // Se access token inválido, tenta refresh - if (!refreshToken) { + if (!refreshToken || !customerName) { + this.logger.error('Invalid refresh token or customer name'); return res.status(401).json({ error: 'Not authenticated' }); } try { // Chama refreshAccessToken - const metadata = PackTheMetadata({}); + const metadata = PackTheMetadata({ + customer_name: customerName + }); + this.logger.info('Call Refresh Token') const data = await this.authClient.refreshAccessToken({ refreshToken }, metadata); + this.logger.info('Finish Refresh Token') // Retorna novo access token e dados mínimos this.addTokenInCookie(res, { accessToken: data.accessToken, @@ -492,6 +541,7 @@ export class AuthController { }; return res.status(200).json(userInfo); } catch (refreshErr) { + this.logger.error(refreshErr) return res.status(401).json({ error: 'Not authenticated' }); } } @@ -504,6 +554,7 @@ export class AuthController { const { exp: expiration } = jwt.decode(tokens.accessToken) as JwtPayload; exp = (expiration - 30) * 1000; // exp em segundos, maxAge em ms + this.logger.info('Set Cookie ddf-auth') res.cookie('ddf-auth', tokens.accessToken, { domain: 'dadosfera.local', maxAge: exp, @@ -514,6 +565,7 @@ export class AuthController { } if (tokens.refreshToken) { + this.logger.info('Set Cookie ddf-refresh-auth') res.cookie('ddf-refresh-auth', tokens.refreshToken, { domain: 'dadosfera.local', maxAge: exp,