---
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)