--- title: Task 1869 - progetto OTP via SMS con PIN tags: Mercury --- * indichiamo a UI di visualizzare schermata PIN grazie a param `EXTRA_authType` * su Issuer lo passiamo in `UserInterfaceInformationAdapter` ## TODO task 1869 - [x] modificare acceptance criteria carta Trello per descrivere nuova autenticazione in due passaggi - [x] creare in Issuer Services nuovo oggetto la cui responsabilità sia di costruire la `CreateAuthenticationResponse` * quest'ultima diventa una semplice data class, senza logica * il suo companion, la `typeOf`, la `with()` ecc. finiscono nel nuovo oggetto - [x] iniettare correttamente `ApplicationProperties` in `ChallengeStepFromAuthentication`, in quanto dobbiamo restituire due step solo se il feature flag `pinWithOTPSms` è attivo * alla fine abbiamo passato un booleano nel costruttore - [x] iniettare successivamente `ApplicationProperties` in `AuthenticationController`, dove viene usata la classe `ChallengeStepFromAuthentication` * rinominare `otpService` in qualcosa che includa sia lo scenario PIN che OTP? - [x] creare tabella `two_factor_authentication_data` su db issuer services. Conterrà al momento l'esito dell'autenticazione con PIN per una certa transazione - [x] Implementare `DbTwoFactorAuthenticationDataRepository` (o altro nome), classe che estenda `TwoFactorAuthenticationDataRepository` e si occupi di salvare su tabella `two_factor_authentication` l'esito dell'autenticazione via PIN. Il salvataggio sarà fatto in `TwoFactorAuthentication` - [x] integrare `TwoFactorAuthentication` nel flusso CheckOTP. Idea è di usarlo per gestire: * il salvataggio dell'esito della checkPIN su db Issuer Services, se flusso è OTP SMS con PIN * gestire l'esito della chiamata al servizio di checkOTP, cioè la seconda chiamata al flusso CheckOTP - [x] rinominare occorrenze rimaste di `PINandSMSHandler` - [ ] verificare su auth business OTS e banca5: con le modifiche alla parte private ISP, anche loro ne sono affette? - [ ] mettere dei log nei nuovi componenti creati - [ ] verificare se modificare il flusso two factor per evitare di chiamare il servizio di check SMS se il valore di firstAuthenticationResult letto da db è false * Fare il wiring anche per Fideuram - [ ] verificare cosa succede ora su Issuer in caso di errore tecnico (su `startOtp` o `checkOtp`) * come ci comportiamo nello scenario PIN + SMS? - [ ] Scrivere uno UAT in `OTPSMSAuthenticationFlowUAT` che testa anche lo scenario "legacy" dove torno SMS quando il flag è attivo e per quando è disattivo... * creo un altro yml che eredita da quello di default ma imposta a false il flag? * abbiamo splittato l'interfaccia in 2 e abbiamo fatto implementare al pin solo l'interfaccia con il check. Questo però ci ha forzato a non poter più utilizzare i "fake pans" per il PIN. Ci va bene? Vorremo vedere se c'è qualche solouzione alternativa che possiamo intraprendere, magari con qualche esperto di Kotlin come piero o fongo. Abbiamo dovuto anche modificare i test VisaCertificationFlowUAT e MastercardCertificationFlowUAT, diamoci un occhio ;). Abbiamo creato il branch spike_separated_interfaces ## TODO refactoring - [ ] refactoring di `ChallengeStepFromAuthentication`: non passargli il booleano, piuttosto fare un'altra classe che genera i due step, e inizializzarla in `ApplicationConfiguration` quando il flag `pinWithOTPSms` è true - [ ] rendere parametrico test `UserAuthenticationStrategySelectorServiceResponseTest#verify that response status is SMS for any bank`, passargli gli ID delle varie banche (ISP, Fideruam) - [ ] rendere parametrico test `ISPChooseAuthenticationServiceTest@choose challenge authentication type obtained from the service`? * nel caso, rimuovere poi test `choose challenge authentication when authentication type is PIN with private card` - [x] modificare `ChallengeStepFromAuthentication#generateChallengeStepList` con una lambda? - [ ] ~~il pin verrà inviato come field `otpCode` nella `AuthenticationAttempt.OTP`~~ salvare il pin inserito in una tabella dedicata del db Issuer Services - [x] modificare la UI, in particolare creare le pagine di invio del PIN e di invio dell'SMS * :recycle: pin => pinCode (da chiedere a NETS) * :recycle: spezzare il megacontroller `AuthenticationController` in tanti pezzi che fanno cose separate (init, start, check, final)? * :recycle: Potremmo rompere l'interfaccia OTPService che ora fa sia send che check (se DAVVERO sono due servizi usati sempre in modo disgiunto...) * così eviteremmo di costringere il nostro PINService ad avere una VOID sendFor, ad es * :recycle: should we rename all the *OTP stuff into something more generic? (it’s not just an OTP stuff, it is also about a PIN code)... * :recycle: the unsolvable error list is duplicated? |=> check doc * **FEATURE TOGGLE**: quando toglieremo il feature flag rimuovere le cose che non sono più necessarie (ad es il "folder" della UI per il vecchio flow SMS private senza PIN)