diff --git a/src/modules/auth/auth.controller.ts b/src/modules/auth/auth.controller.ts index 648a36f..42eb27d 100644 --- a/src/modules/auth/auth.controller.ts +++ b/src/modules/auth/auth.controller.ts @@ -54,7 +54,6 @@ import jwt, { JwtPayload } from 'jsonwebtoken'; import { LanguageEnum } from 'src/utils/languages.enum'; import { Language } from 'src/decorators/language.decorator'; import { ApiInternalOnlyEndpoint } from 'src/decorators/swagger.decorator'; -import { Cookie } from 'express-session'; type CookiesValues = { accessToken?: string; @@ -498,29 +497,10 @@ export class AuthController { const userId = req.cookies['ddf-user-id']; 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') - const { kid } = decoded.header; - // Busca a chave pública - const { keys } = await this.authClient.getPublicKeys(); - const pemValue = keys.find((k) => k.kid === kid)?.pem; - if (!pemValue) throw new Error('Public key not found'); - jwt.verify(accessToken, pemValue); - payload = decoded.payload; - userInfo = { - id: payload.user_id, - name: payload.username, - customer: { - id: payload.customer_id, - name: payload.customer_name, - tier: payload.customer_tier, - } - }; - return res.status(200).json(userInfo); + const userDto = await this.authClient.extractUserFrom(accessToken); + return res.status(200).json({userDto}); } catch (err) { this.logger.error(err.message); const refreshToken = req.cookies['ddf-refresh-auth']; @@ -545,18 +525,8 @@ export class AuthController { userId }); // Decodifica novo token - const decoded: any = jwt.decode(data.accessToken, { complete: true }); - const payload = decoded.payload; - userInfo = { - id: payload.user_id, - name: payload.username, - customer: { - id: payload.customer_id, - name: payload.customer_name, - tier: payload.customer_tier, - } - }; - return res.status(200).json(userInfo); + const userDto = await this.authClient.extractUserFrom(accessToken); + return res.status(200).json(userDto); } catch (refreshErr) { this.logger.error(refreshErr) return res.status(401).json({ error: 'Not authenticated' }); diff --git a/src/modules/auth/auth.service.ts b/src/modules/auth/auth.service.ts index c94a8d0..3a17327 100644 --- a/src/modules/auth/auth.service.ts +++ b/src/modules/auth/auth.service.ts @@ -4,7 +4,7 @@ import { DadosferaLogger } from '@dadosfera/dadosfera-logs'; import { lastValueFrom } from 'rxjs'; import { ProtoServices } from '@dadosfera/protospack-v2/dist/lib/Duc'; -import { AuthProtoService as AuthServiceInterface, IdentityProviderProtoService } from '@dadosfera/protospack-v2/dist/lib/Duc/interfaces/write-service'; +import { AuthProtoService as AuthServiceInterface, IdentityProviderProtoService, UsersProtoService } from '@dadosfera/protospack-v2/dist/lib/Duc/interfaces/write-service'; import { AuthSnowflakeSignInRequest, AuthSignInRequest, @@ -21,18 +21,18 @@ import { } from '@dadosfera/protospack-v2/dist/lib/Duc/interfaces/messages'; import { DucClient } from '../duc/client.config'; import { Metadata } from '@grpc/grpc-js'; -import { BulkEditResponse } from './dtos/login'; - +import { BulkEditResponse, UserDTO } from './dtos/login'; +import jwt from 'jsonwebtoken'; +import { PackTheMetadata } from 'src/utils/PackTheMetadata'; @Injectable() export class AuthClientService implements OnModuleInit { - logger: DadosferaLogger; - private authService: AuthServiceInterface; - private identityProviderService: IdentityProviderProtoService; + private userService: UsersProtoService; + constructor( @Inject(DadosferaLogger) dadosferaLogger: DadosferaLogger, @@ -46,8 +46,8 @@ export class AuthClientService implements OnModuleInit { ProtoServices.AuthProtoService, ); - this.identityProviderService = this.grpcClient.getService( - ProtoServices.IdentityProviderProtoService, + this.userService = this.grpcClient.getService( + ProtoServices.UsersProtoService, ); } @@ -283,4 +283,51 @@ export class AuthClientService implements OnModuleInit { throw error; } } + + private async getUser(id: string, metadata: Metadata) { + this.logger.info('getUser'); + return await lastValueFrom( + this.userService.UserFindOneById({ id }, metadata), + ); + } + + public async extractUserFrom(token: string) { + const decoded: any = token && jwt.decode(token, { complete: true }); + if (!decoded) throw new Error('Invalid token'); + + const { kid } = decoded.header; + // Busca a chave pública + const { keys } = await this.getPublicKeys(); + const pemValue = keys.find((k) => k.kid === kid)?.pem; + if (!pemValue) + throw new Error('Public key not found'); + jwt.verify(token, pemValue); + + const payload = decoded.payload; + const metadata = PackTheMetadata({ + customer_id: payload.customer_id + }) + + const { + user + } = await this.getUser( + payload.user_id, + metadata + ); + + const userDto: UserDTO = { + id: user.id, + name: user.username, + jobTitle: user?.jobTitle || null, + department: user?.department || null, + hierarchy: user?.hierarchy || null, + customer: { + id: payload.customer_id, + name: payload.customer_name, + tier: payload.customer_tier, + } + }; + + return userDto; + } } diff --git a/src/modules/auth/dtos/login.ts b/src/modules/auth/dtos/login.ts index dc57d54..3a484c8 100644 --- a/src/modules/auth/dtos/login.ts +++ b/src/modules/auth/dtos/login.ts @@ -140,3 +140,16 @@ export interface BulkEditResponse { successfulUsers: string[]; failedUsers: string[]; } + +export type UserDTO = { + id: string, + name: string, + jobTitle?: string, + department?: string, + hierarchy?: string, + customer: { + id: string, + name: string, + tier: string, + } +}