Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add a qrcode MFA, webservice, service and encryption for the secret key #19

Draft
wants to merge 6 commits into
base: master
Choose a base branch
from

Conversation

benoitvasseur
Copy link

No description provided.

@lucas-amiaud
Copy link
Contributor

Hello,
Au delà de l'implem, est-ce que ca ne serait pas un module plume en tant que tel (ex plume-admin-mfa) avec :

  • un table dédiée jointe sur le user ID, avec l'identifiant du authentication factor et sa valeur (pour en avoir n)
  • possibilité de register un authentication factor parmi ceux implémentés, ou possibilité de créer son propre truc en utilisant les interfaces du module
    Ajouter dans plume admin :
  • une interface de service type MfaService qui est implémentée par le module
  • de base implémentée par plume-admin mais qui fait rien (là je suis moins sûr)

enfin bref, dans l'ensemble ouvrir un porte dans plume-admin, porte exploitable par un module qui implémente de genre de choses, et à qui on peut donner d'autres authentication factor

@amanteaux

@benoitvasseur
Copy link
Author

Hello, Au delà de l'implem, est-ce que ca ne serait pas un module plume en tant que tel (ex plume-admin-mfa) avec :

C'est sûrement une bonne idée, on va avoir pas mal de dépendance sinon qui vont s'ajouter puisqu'il va y en avoir pour chacun des MFA

  • un table dédiée jointe sur le user ID, avec l'identifiant du authentication factor et sa valeur (pour en avoir n)

Yes ca complètement => Done dans le dernier commit

  • possibilité de register un authentication factor parmi ceux implémentés, ou possibilité de créer son propre truc en utilisant les interfaces du module

Oui, on pourrait faire un MfaService qui a une map d'implem / type, et pouvoir en ajouter dynamiquement ?

Ajouter dans plume admin :

  • une interface de service type MfaService qui est implémentée par le module
  • de base implémentée par plume-admin mais qui fait rien (là je suis moins sûr)
    Pas sûr de comprendre, genre l'API est exposé dans plume admin, mais pas l'implem ?

enfin bref, dans l'ensemble ouvrir un porte dans plume-admin, porte exploitable par un module qui implémente de genre de choses, et à qui on peut donner d'autres authentication factor

@amanteaux

Copy link
Member

@amanteaux amanteaux left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Il faudrait faire une lib à part, ça semble trop gros et trop spécifique :

  • Ca va trop compliquer la maintenance de plume admin si on ajoute ça
  • C'est difficile de l'utiliser hors back-office en l'état, ce qui est dommage
  • Par contre, dans plume admin, ça pourrait être bien d'avoir un test d'intégration qui permette de vérifier qu'on ne casse pas plume mfa

Il faudrait documenter le processus global.

Il faudrait annoter les méthodes pour préciser ce qui est nullable et ce qui ne l'est pas.

Pour quelque chose d'aussi sensible, il faudrait ajouter des tests unitaires.

Globalement la qualité de code ne me rassure pas trop, ça sent un peu trop le GPT pas assez nettoyé.

public String encrypt(String data) throws Exception {
Cipher cipher = Cipher.getInstance(ALGORITHM);
byte[] iv = new byte[IV_SIZE];
SecureRandom random = new SecureRandom();
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

SecureRandom est thread safe => autant l'initialiser qu'une seule fois

@@ -16,13 +19,14 @@ CREATE TABLE `PLM_USER` (
`email` varchar(255) NOT NULL,
`user_name` varchar(255) NOT NULL,
`password` varchar(255) NOT NULL,
`mfa_user_handle` BLOB DEFAULT NULL,
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pourquoi ce n'est pas dans la table PLM_USER_MFA ?

PublicKeyCredential<AuthenticatorAttestationResponse, ClientRegistrationExtensionOutputs> pkc
) {
AdminMfaBrowser mfa = new AdminMfaBrowser();
mfa.setKeyId(result.getKeyId().getId().getBytes());
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

C'est normal de faire .getBytes() ici ?

AdminUserMfa userMfa = new AdminUserMfa();
userMfa.setIdUser(user.getId());
userMfa.setIdMfaBrowser(mfa.getId());
userMfa.setType("Browser");
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Il faudrait passer par une enum non ?

adminUserMfaDao.save(userMfa);
}

public void updateCredential(
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Il faudrait document pour expliquer ce qu'on veut faire ici, c'est pas clair du tout pour moi

// Return the QR code URL to the client
return new AdminMfaQrcode(qrCodeUrl);
} catch (Exception e) {
logger.debug("erreur lors de la génération du QR code", e);
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

On met les commentaires plutôt en anglais

try {
PublicKeyCredential<AuthenticatorAttestationResponse, ClientRegistrationExtensionOutputs> pkc =
PublicKeyCredential.parseRegistrationResponseJson(publicKeyCredentialJson);
boolean success = mfaService.finishRegistration(authenticatedUser.getUser(), pkc);
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Si c'est pour utiliser le truc comme ça, autant laisser la méthode lever une exception en cas de souci, le résultat sera correctement loggé et l'erreur interne sera reoturnée, ça évite toute cette logique

return Response.ok().build();
} catch (IOException e) {
logger.error("publicKeyCredentialJson parsing error", e);
return Response.serverError().build();
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Même chose ici, cette logique est inutile, surtout qu'elle ne suit pas les conventions habituelles pour retourner une erreur INTERNAL_ERROR

Comment on lines +249 to +252
} catch (JsonProcessingException e) {
logger.debug("erreur lors de la génération du credentialGetOptions", e);
throw new WsException(WsError.INTERNAL_ERROR);
}
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Code inutile

.build();

} catch (IOException e) {
throw new WsException(AdminWsError.WRONG_LOGIN_OR_PASSWORD);
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Uh ?? S'il y a une erreur IO, ça veut dire que le login ou le password est mauvais ?

@benoitvasseur
Copy link
Author

Il faudrait faire une lib à part, ça semble trop gros et trop spécifique :

Yes c'était la discussion qu'on avait plus haut.
Faut voir comment on découpe ça. Il y a des impacts sur le schéma de bdd, sur le parcours de connexion (il ne faut pas qu'on puisse appeler direct l'auth pour récupérer un token). Ca demande un peu d'archi suivant comment on veut séparer tout ça.

  • Ca va trop compliquer la maintenance de plume admin si on ajoute ça
  • C'est difficile de l'utiliser hors back-office en l'état, ce qui est dommage
  • Par contre, dans plume admin, ça pourrait être bien d'avoir un test d'intégration qui permette de vérifier qu'on ne casse pas plume mfa

Il faudrait documenter le processus global.

Je ferais la doc quand on aura réfléchi à l'archi :p

Il faudrait annoter les méthodes pour préciser ce qui est nullable et ce qui ne l'est pas.

Pour quelque chose d'aussi sensible, il faudrait ajouter des tests unitaires.

Globalement la qualité de code ne me rassure pas trop, ça sent un peu trop le GPT pas assez nettoyé.

Non c'est juste un draft pour vérifier que techniquement ça marche. C'est loin d'être finit, d'où les exceptions qui sont pas vraiment gérer. Y'a plein de refacto à faire que je voulais pas toucher tant qu'on savait pas vraiment comment on voulait pas l'intégrer. Surtout depuis qu'on m'a dit qu'il n'y avait qu'un 2FA (QR Code) de vendu enfait.

@amanteaux
Copy link
Member

Oui c'est clair, on est en phase. Désolé pour le commentaire un peu sec !

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

4 participants