From d3e7c9e80240c068aca2fe6a3915e222f83810fd Mon Sep 17 00:00:00 2001 From: OxSaitama Date: Wed, 11 Oct 2023 12:28:47 +0200 Subject: [PATCH 1/2] refacto refresh token --- src/app/api/id360/CustomerController.ts | 36 ++++++++++++++++++- src/app/api/idnot/UserController.ts | 3 ++ .../DocumentsService/DocumentsService.ts | 1 - .../common/AuthService/AuthService.ts | 4 +++ .../DocumentsService/DocumentsService.ts | 1 - .../DocumentsService/DocumentsService.ts | 1 - 6 files changed, 42 insertions(+), 4 deletions(-) diff --git a/src/app/api/id360/CustomerController.ts b/src/app/api/id360/CustomerController.ts index 475b5bb6..1af0e969 100644 --- a/src/app/api/id360/CustomerController.ts +++ b/src/app/api/id360/CustomerController.ts @@ -4,7 +4,7 @@ import ApiController from "@Common/system/controller-pattern/ApiController"; import { Service } from "typedi"; import Id360Service, { EnrollmentResponse } from "@Services/common/Id360Service/Id360Service"; import CustomersService from "@Services/customer/CustomersService/CustomersService"; -import AuthService from "@Services/common/AuthService/AuthService"; +import AuthService, { ICustomerJwtPayload } from "@Services/common/AuthService/AuthService"; import { Customer } from "le-coffre-resources/dist/SuperAdmin"; @Controller() @@ -88,4 +88,38 @@ export default class CustomerController extends ApiController { return; } } + + @Post("/api/v1/id360/customers/refresh-token") + protected async refreshToken(req: Request, response: Response) { + try { + const authHeader = req.headers["authorization"]; + const token = authHeader && authHeader.split(" ")[1]; + + if (!token) { + this.httpBadRequest(response); + return; + } + + let accessToken; + this.authService.verifyRefreshToken(token, (err, userPayload) => { + if (err) { + console.log(err); + this.httpUnauthorized(response); + return; + } + + const user = userPayload as ICustomerJwtPayload; + delete user.iat; + delete user.exp; + accessToken = this.authService.generateAccessToken(user); + }); + + //success + this.httpSuccess(response, { accessToken }); + } catch (error) { + console.log(error); + this.httpInternalError(response); + return; + } + } } diff --git a/src/app/api/idnot/UserController.ts b/src/app/api/idnot/UserController.ts index 9952e029..cac75ffc 100644 --- a/src/app/api/idnot/UserController.ts +++ b/src/app/api/idnot/UserController.ts @@ -70,12 +70,15 @@ export default class UserController extends ApiController { } const user = userPayload as IUserJwtPayload; + delete user.iat; + delete user.exp; accessToken = this.authService.generateAccessToken(user); }); //success this.httpSuccess(response, { accessToken }); } catch (error) { + console.log(error); this.httpInternalError(response); return; } diff --git a/src/services/admin/DocumentsService/DocumentsService.ts b/src/services/admin/DocumentsService/DocumentsService.ts index 5bdbead9..d76bd983 100644 --- a/src/services/admin/DocumentsService/DocumentsService.ts +++ b/src/services/admin/DocumentsService/DocumentsService.ts @@ -46,7 +46,6 @@ export default class DocumentsService extends BaseService { public async refuse(uid: string, document: Partial, refused_reason: string): Promise { if (document.files) { for (let i = 0; i < document.files.length; i++) { - console.log("archiving file", document.files[i]?.uid); await this.filesRepository.deleteKeyAndArchive(document.files[i]?.uid as string); } } diff --git a/src/services/common/AuthService/AuthService.ts b/src/services/common/AuthService/AuthService.ts index 88ed6af4..ca272d65 100644 --- a/src/services/common/AuthService/AuthService.ts +++ b/src/services/common/AuthService/AuthService.ts @@ -14,6 +14,8 @@ enum PROVIDER_OPENID { export interface ICustomerJwtPayload { customerId: string; email: string; + iat?: number; + exp?: number; } export interface IdNotJwtPayload { @@ -31,6 +33,8 @@ export interface IUserJwtPayload { office_Id: string; role: string; rules: string[]; + iat?: number; + exp?: number; } @Service() diff --git a/src/services/notary/DocumentsService/DocumentsService.ts b/src/services/notary/DocumentsService/DocumentsService.ts index c2260763..8f0819ac 100644 --- a/src/services/notary/DocumentsService/DocumentsService.ts +++ b/src/services/notary/DocumentsService/DocumentsService.ts @@ -46,7 +46,6 @@ export default class DocumentsService extends BaseService { public async refuse(uid: string, document: Partial, refused_reason: string): Promise { if (document.files) { for (let i = 0; i < document.files.length; i++) { - console.log("archiving file", document.files[i]?.uid); await this.filesRepository.deleteKeyAndArchive(document.files[i]?.uid as string); } } diff --git a/src/services/super-admin/DocumentsService/DocumentsService.ts b/src/services/super-admin/DocumentsService/DocumentsService.ts index 41041d7e..90cc405a 100644 --- a/src/services/super-admin/DocumentsService/DocumentsService.ts +++ b/src/services/super-admin/DocumentsService/DocumentsService.ts @@ -46,7 +46,6 @@ export default class DocumentsService extends BaseService { public async refuse(uid: string, document: Partial, refused_reason: string): Promise { if (document.files) { for (let i = 0; i < document.files.length; i++) { - console.log("archiving file", document.files[i]?.uid); await this.filesRepository.deleteKeyAndArchive(document.files[i]?.uid as string); } } From 8f7367eb63240971b6bab78aefa48d538b4b4231 Mon Sep 17 00:00:00 2001 From: OxSaitama Date: Wed, 11 Oct 2023 13:00:34 +0200 Subject: [PATCH 2/2] fix redirection on login error --- .../api/franceConnect/CustomerController.ts | 67 ------------------- src/app/api/id360/CustomerController.ts | 4 +- src/app/index.ts | 2 - .../controller-pattern/BaseController.ts | 1 + 4 files changed, 2 insertions(+), 72 deletions(-) delete mode 100644 src/app/api/franceConnect/CustomerController.ts diff --git a/src/app/api/franceConnect/CustomerController.ts b/src/app/api/franceConnect/CustomerController.ts deleted file mode 100644 index 7d05215f..00000000 --- a/src/app/api/franceConnect/CustomerController.ts +++ /dev/null @@ -1,67 +0,0 @@ -import { Response, Request } from "express"; -import { Controller, Post } from "@ControllerPattern/index"; -import ApiController from "@Common/system/controller-pattern/ApiController"; -import { Service } from "typedi"; -import AuthService, { ICustomerJwtPayload } from "@Services/common/AuthService/AuthService"; -import { JwtPayload } from "jsonwebtoken"; - -@Controller() -@Service() -export default class CustomerController extends ApiController { - constructor(private authService: AuthService) { - super(); - } - - // @Post("/api/v1/france-connect/customer/login/:email") - // protected async login(req: Request, response: Response) { - // try { - // const email = req.params["email"]; - // if (!email) throw new Error("email is required"); - - // const payload = await this.authService.getCustomerJwtPayload(email); - // if (!payload) { - // this.httpNotFoundRequest(response); - // return; - // } - // const accessToken = this.authService.generateAccessToken(payload); - // const refreshToken = this.authService.generateRefreshToken(payload); - // //success - // this.httpSuccess(response, { accessToken, refreshToken }); - // } catch (error) { - // this.httpInternalError(response); - // return; - // } - // } - - @Post("/api/v1/france-connect/customer/refresh-token") - protected async refreshToken(req: Request, response: Response) { - try { - const authHeader = req.headers["authorization"]; - const token = authHeader && authHeader.split(" ")[1]; - - if (!token) { - this.httpBadRequest(response); - return; - } - - let accessToken; - this.authService.verifyRefreshToken(token, (err, customerPayload) => { - if (err) { - this.httpUnauthorized(response); - return; - } - - const customer = customerPayload as JwtPayload; - delete customer.iat; - delete customer!.exp; - accessToken = this.authService.generateAccessToken({...customer} as ICustomerJwtPayload); - }); - - //success - this.httpSuccess(response, {accessToken}); - } catch (error) { - this.httpInternalError(response); - return; - } - } -} diff --git a/src/app/api/id360/CustomerController.ts b/src/app/api/id360/CustomerController.ts index 1af0e969..086b40b0 100644 --- a/src/app/api/id360/CustomerController.ts +++ b/src/app/api/id360/CustomerController.ts @@ -34,11 +34,9 @@ export default class CustomerController extends ApiController { return; } try { + await new Promise( resolve => setTimeout(resolve, 3000)); // wait 3 seconds to be sure that the enrollment is finilazed const res = await this.id360Service.getEnrollment(callbackToken); const enrollment = await res.json() as EnrollmentResponse; - if(enrollment.status === "STARTED") { - this.loginCallback(req, response); - } if (enrollment.status !== "OK") { this.httpUnauthorized(response, "Enrollment status is not OK"); return; diff --git a/src/app/index.ts b/src/app/index.ts index 274b1ed2..f5c3f00a 100644 --- a/src/app/index.ts +++ b/src/app/index.ts @@ -9,7 +9,6 @@ import DeedTypesControllerSuperAdmin from "./api/super-admin/DeedTypesController import DocumentsControllerSuperAdmin from "./api/super-admin/DocumentsController"; import DocumentTypesControllerSuperAdmin from "./api/super-admin/DocumentTypesController"; import IdNotUserController from "./api/idnot/UserController"; -import FranceConnectCustomerController from "./api/franceConnect/CustomerController"; import FilesControllerSuperAdmin from "./api/super-admin/FilesController"; import RulesControllerSuperAdmin from "./api/super-admin/RulesController"; import RolesControllerSuperAdmin from "./api/super-admin/RolesController"; @@ -64,7 +63,6 @@ export default { Container.get(DocumentTypesControllerSuperAdmin); Container.get(LiveVoteController); Container.get(IdNotUserController); - Container.get(FranceConnectCustomerController); Container.get(FilesControllerSuperAdmin); Container.get(DocumentsControllerSuperAdmin); Container.get(RulesControllerSuperAdmin); diff --git a/src/common/system/controller-pattern/BaseController.ts b/src/common/system/controller-pattern/BaseController.ts index 7baa9c02..b13d997a 100644 --- a/src/common/system/controller-pattern/BaseController.ts +++ b/src/common/system/controller-pattern/BaseController.ts @@ -45,6 +45,7 @@ export default abstract class BaseController { } protected httpResponse(response: Response, httpCode: HttpCodes, responseData: IResponseData = {}) { + console.log("httpResponse", httpCode, responseData); if (responseData instanceof Error) { throw responseData; }