---
# System prepended metadata

title: Task 1869 - progetto OTP via SMS con PIN
tags: [Mercury]

---

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

