This commit is contained in:
Hugo Lextrait 2023-04-13 17:58:40 +02:00
commit 88c13c7c03
9 changed files with 146 additions and 83 deletions

View File

@ -21,5 +21,5 @@ version: 0.0.1
# incremented each time you make changes to the application. Versions are not expected to # incremented each time you make changes to the application. Versions are not expected to
# follow Semantic Versioning. They should reflect the version the application is using. # follow Semantic Versioning. They should reflect the version the application is using.
# It is recommended to use it with quotes. # It is recommended to use it with quotes.
appVersion: 0.2.5 appVersion: 0.3.7

View File

@ -11,6 +11,8 @@ const nextConfig = {
BACK_API_VERSION: process.env.BACK_API_VERSION, BACK_API_VERSION: process.env.BACK_API_VERSION,
FRONT_APP_HOST: process.env.FRONT_APP_HOST, FRONT_APP_HOST: process.env.FRONT_APP_HOST,
FRONT_APP_PORT: process.env.FRONT_APP_PORT, FRONT_APP_PORT: process.env.FRONT_APP_PORT,
IDNOT_AUTHORIZE_ENDPOINT: process.env.IDNOT_AUTHORIZE_ENDPOINT,
IDNOT_CLIENT_ID: process.env.IDNOT_CLIENT_ID,
}, },
}; };

View File

@ -1,5 +1,6 @@
import { Service } from "typedi"; import { Service } from "typedi";
import BaseApiService from "@Front/Api/BaseApiService"; import BaseApiService from "@Front/Api/BaseApiService";
import { FrontendVariables } from "@Front/Config/VariablesFront";
@Service() @Service()
export default class Auth extends BaseApiService { export default class Auth extends BaseApiService {
@ -10,30 +11,21 @@ export default class Auth extends BaseApiService {
} }
public static getInstance(): Auth { public static getInstance(): Auth {
return (this.instance = this.instance ?? new Auth()); return (this.instance = this.instance ?? new this());
} }
public async userSignin() { public async getIdnotJwt(autorizationCode: string | string[]): Promise<any> {
const url = new URL( const variables = FrontendVariables.getInstance();
"https://qual-connexion.idnot.fr/IdPOAuth2/authorize/idnot_idp_v1?client_id=4501646203F3EF67&redirect_uri=http://0.0.0.0:3000/authorized-client&scope=openid,profile,offline_access&response_type=code" const baseBackUrl =
); variables.BACK_API_PROTOCOL +
variables.BACK_API_HOST +
(variables.BACK_API_PORT ? ":" + variables.BACK_API_PORT : "");
const url = new URL(`${baseBackUrl}/api/v1/idnot-user/${autorizationCode}`);
try { try {
return await this.getRequest<any>(url); return await this.postRequest<any>(url);
} catch (err) { } catch (err) {
this.onError(err); this.onError(err);
return Promise.reject(err); return Promise.reject(err);
} }
} }
public async getIdnotJwt(autorizationCode: string | string[]) {
const url = new URL(
`http://127.0.0.1:3001/api/v1/idnot-user/${autorizationCode}`
);
try {
await this.postRequest<any>(url);
} catch (err) {
this.onError(err);
//return Promise.reject(err);
}
}
} }

View File

Before

Width:  |  Height:  |  Size: 645 B

After

Width:  |  Height:  |  Size: 644 B

View File

@ -29,10 +29,10 @@ export default class ClientSection extends React.Component<IProps, IState> {
} }
private renderCustomerFolders() { private renderCustomerFolders() {
const output = this.props.folder.office_folder_has_customers?.map((folderHasCustomer) => { const output = this.props.folder.office_folder_has_customers?.map((folderHasCustomer, key) => {
if (!folderHasCustomer.customer) return null; if (!folderHasCustomer.customer) return null;
// TODO : Les documents ASKED fonctionne mais les autres documents ne doivcent etre seulement ceux qui correspondent au folder // TODO : Les documents ASKED fonctionne mais les autres documents ne doivcent etre seulement ceux qui correspondent au folder
return <div className={classes["user-folder"]}><UserFolder folder={this.props.folder} customer={folderHasCustomer.customer} key={folderHasCustomer.customer.uid} /></div>; return <div className={classes["user-folder"]} key={folderHasCustomer.customer.uid}><UserFolder folder={this.props.folder} customer={folderHasCustomer.customer} /></div>;
}) })
return output ?? null; return output ?? null;
} }

View File

@ -3,34 +3,47 @@ import Typography, { ITypo } from "@Front/Components/DesignSystem/Typography";
import BasePage from "../Base"; import BasePage from "../Base";
import classes from "./classes.module.scss"; import classes from "./classes.module.scss";
import CoffreIcon from "@Assets/Icons/coffre.svg"; import CoffreIcon from "@Assets/Icons/coffre.svg";
import LandingImage from "./landing-connect.png" import LandingImage from "./landing-connect.png";
import Image from "next/image"; import Image from "next/image";
import DefaultDoubleSidePage from "@Front/Components/LayoutTemplates/DefaultDoubleSidePage"; import DefaultDoubleSidePage from "@Front/Components/LayoutTemplates/DefaultDoubleSidePage";
import { FrontendVariables } from "@Front/Config/VariablesFront"; import { FrontendVariables } from "@Front/Config/VariablesFront";
export default class LoginClass extends BasePage { export default class LoginClass extends BasePage {
public override render(): JSX.Element { public override render(): JSX.Element {
return ( return (
<DefaultDoubleSidePage title={"Login"} image={LandingImage}> <DefaultDoubleSidePage title={"Login"} image={LandingImage}>
<div className={classes["root"]}> <div className={classes["root"]}>
<Image alt="coffre" src={CoffreIcon} /> <Image alt="coffre" src={CoffreIcon} />
<Typography typo={ITypo.H1}><div className={classes["title"]}>Connexion espace professionnel</div></Typography> <Typography typo={ITypo.H1}>
<Button onClick={this.redirectUserOnConnection}>Sidentifier avec ID.not</Button> <div className={classes["title"]}>
<Typography typo={ITypo.P_18}><div className={classes["forget-password"]}>Vous narrivez pas à vous connecter ?</div></Typography> Connexion espace professionnel
<Button variant={EButtonVariant.LINE} >Contacter ladministrateur</Button> </div>
</div> </Typography>
</DefaultDoubleSidePage> <Button onClick={this.redirectUserOnConnection}>
); Sidentifier avec ID.not
} </Button>
<Typography typo={ITypo.P_18}>
<div className={classes["forget-password"]}>
Vous narrivez pas à vous connecter ?
</div>
</Typography>
<Button variant={EButtonVariant.LINE}>
Contacter ladministrateur
</Button>
</div>
</DefaultDoubleSidePage>
);
}
private redirectUserOnConnection() { private redirectUserOnConnection() {
// check variable const variables = FrontendVariables.getInstance();
const baseFronturl = FrontendVariables.getInstance().BACK_API_PROTOCOL + const baseFronturl =
FrontendVariables.getInstance().FRONT_APP_HOST + variables.BACK_API_PROTOCOL +
(FrontendVariables.getInstance().FRONT_APP_PORT ? ":" + FrontendVariables.getInstance().FRONT_APP_PORT : ""); variables.FRONT_APP_HOST +
(variables.FRONT_APP_PORT ? ":" + variables.FRONT_APP_PORT : "");
const url = `https://qual-connexion.idnot.fr/IdPOAuth2/authorize/idnot_idp_v1?client_id=4501646203F3EF67&redirect_uri=${baseFronturl}/authorized-client&scope=openid,profile,offline_access&response_type=code` const authorizeEndPoint = variables.IDNOT_AUTHORIZE_ENDPOINT;
const clientId = variables.IDNOT_CLIENT_ID;
window.location.assign(url) const url = `${authorizeEndPoint}?client_id=${clientId}&redirect_uri=${baseFronturl}/authorized-client&scope=openid,profile,offline_access&response_type=code`;
} window.location.assign(url);
}
} }

View File

@ -1,45 +1,90 @@
import classes from "./classes.module.scss"; // import classes from "./classes.module.scss";
import LandingImage from "../Login/landing-connect.png"; // import LandingImage from "../Login/landing-connect.png";
import DefaultDoubleSidePage from "@Front/Components/LayoutTemplates/DefaultDoubleSidePage"; // import DefaultDoubleSidePage from "@Front/Components/LayoutTemplates/DefaultDoubleSidePage";
import Router, { useRouter } from "next/router"; // import Image from "next/image";
// import CoffreIcon from "@Assets/Icons/coffre.svg";
// import Button, { EButtonVariant } from "@Front/Components/DesignSystem/Button";
// import Typography, { ITypo } from "@Front/Components/DesignSystem/Typography";
import { useRouter } from "next/router";
//import React, { useEffect, useState } from "react";
import React from "react"; import React from "react";
import Loader from "@Front/Components/DesignSystem/Loader"; //import Loader from "@Front/Components/DesignSystem/Loader";
import Auth from "@Front/Api/Auth/IdNot"; import Auth from "@Front/Api/Auth/IdNot";
import Folder from "../Folder";
import LoginClass from "../Login";
type IPropsClass = {}; type IPropsClass = {};
type IStateClass = {}; // type IStateClass = {};
class LoginCallBackClass extends React.Component<IPropsClass, IStateClass> { // class LoginCallBackClass extends React.Component<IPropsClass, IStateClass> {
public override render(): JSX.Element { // public override render(): JSX.Element {
return ( // return (
<DefaultDoubleSidePage title={"Login"} image={LandingImage}> // <DefaultDoubleSidePage title={"Login"} image={LandingImage}>
<div className={classes["root"]}> // <div className={classes["root"]}>
<Loader /> // <Image alt="coffre" src={CoffreIcon} />
</div> // <Typography typo={ITypo.H1}>
</DefaultDoubleSidePage> // <div className={classes["title"]}>
); // Connexion espace professionnel
} // </div>
} // </Typography>
// <Loader />
// <Typography typo={ITypo.P_18}>
// <div className={classes["forget-password"]}>
// Vous narrivez pas à vous connecter ?
// </div>
// </Typography>
// <Button variant={EButtonVariant.LINE}>
// Contacter ladministrateur
// </Button>
// </div>
// </DefaultDoubleSidePage>
// );
// }
// }
// TODO: Refacto with functionnal component container of classcomponent // TODO: Refacto with functionnal component container of classcomponent
// export default function LoginCallBack(props: IPropsClass) {
// const [user, setUser] = useState(null);
// const [isLoading, setIsLoading] = useState(false);
// const router = useRouter();
// const { code } = router.query;
// if (code) {
// useEffect(() => {
// const getIdNotJwt = async () => {
// setIsLoading(true);
// try {
// const authService = Auth.getInstance();
// const fetchedUser = await authService.getIdnotJwt(code);
// setUser(fetchedUser);
// } catch (error) {
// console.error(error);
// // Router.push('/login');
// }
// };
// getIdNotJwt();
// }, []);
// if (isLoading) return <LoginCallBackClass {... props}/>
// return <Folder {...props} />;
// }
// return <LoginClass {...props}/>
// }
export default function LoginCallBack(props: IPropsClass) { export default function LoginCallBack(props: IPropsClass) {
const router = useRouter(); const router = useRouter();
const { code } = router.query; const { code } = router.query;
if (code) { if (code) {
const getIdNotJwt = async () => { const getIdNotJwt = async () => {
try { try {
const authService = Auth.getInstance(); const authService = Auth.getInstance();
const user = await authService.getIdnotJwt(code); await authService.getIdnotJwt(code);
console.log(user); } catch (error) {
Router.push('/dossier'); console.error(error);
} catch (error) { }
console.error(error); };
Router.push('/login'); getIdNotJwt();
} return <Folder {...props} />;
}; }
getIdNotJwt(); return <LoginClass {...props}/>
} }
return <LoginCallBackClass {...props} />;
}

View File

@ -15,6 +15,10 @@ export class FrontendVariables {
public FRONT_APP_PORT!: string; public FRONT_APP_PORT!: string;
public IDNOT_AUTHORIZE_ENDPOINT!: string;
public IDNOT_CLIENT_ID!: string;
private constructor() {} private constructor() {}
public static getInstance(): FrontendVariables { public static getInstance(): FrontendVariables {

View File

@ -19,9 +19,11 @@ type AppPropsWithLayout = AppProps & {
backApiVersion: string, backApiVersion: string,
frontAppHost: string, frontAppHost: string,
frontAppPort: string, frontAppPort: string,
idNotAuthorizeEndpoint: string;
idNotClientId: string;
}; };
const MyApp = (({ Component, pageProps, backApiProtocol, backApiHost, backApiPort, backApiRootUrl, backApiVersion, frontAppHost, frontAppPort }: AppPropsWithLayout) => { const MyApp = (({ Component, pageProps, backApiProtocol, backApiHost, backApiPort, backApiRootUrl, backApiVersion, frontAppHost, frontAppPort, idNotAuthorizeEndpoint, idNotClientId }: AppPropsWithLayout) => {
const getLayout = Component.getLayout ?? ((page) => <DefaultLayout children={page}></DefaultLayout>); const getLayout = Component.getLayout ?? ((page) => <DefaultLayout children={page}></DefaultLayout>);
FrontendVariables.getInstance().BACK_API_PROTOCOL = backApiProtocol; FrontendVariables.getInstance().BACK_API_PROTOCOL = backApiProtocol;
@ -31,6 +33,9 @@ const MyApp = (({ Component, pageProps, backApiProtocol, backApiHost, backApiPor
FrontendVariables.getInstance().BACK_API_VERSION = backApiVersion; FrontendVariables.getInstance().BACK_API_VERSION = backApiVersion;
FrontendVariables.getInstance().FRONT_APP_HOST = frontAppHost; FrontendVariables.getInstance().FRONT_APP_HOST = frontAppHost;
FrontendVariables.getInstance().FRONT_APP_PORT = frontAppPort; FrontendVariables.getInstance().FRONT_APP_PORT = frontAppPort;
FrontendVariables.getInstance().IDNOT_AUTHORIZE_ENDPOINT = idNotAuthorizeEndpoint;
FrontendVariables.getInstance().IDNOT_CLIENT_ID = idNotClientId;
return getLayout(<Component {...pageProps} />); return getLayout(<Component {...pageProps} />);
}) as AppType; }) as AppType;
@ -44,6 +49,8 @@ MyApp.getInitialProps = async () => {
backApiVersion: process.env["BACK_API_VERSION"], backApiVersion: process.env["BACK_API_VERSION"],
frontAppHost: process.env["FRONT_APP_HOST"], frontAppHost: process.env["FRONT_APP_HOST"],
frontAppPort: process.env["FRONT_APP_PORT"], frontAppPort: process.env["FRONT_APP_PORT"],
idNotAuthorizeEndpoint: process.env["IDNOT_AUTHORIZE_ENDPOINT"],
idNotClientId: process.env["IDNOT_CLIENT_ID"],
}; };
} }