package Ġcom . fin you . fin track . backend . app . ktor Ċ Ċ import Ġcom . auth 0 . jwt . JWT Ċ import Ġcom . auth 0 . jwt . algorithms . Algorithm Ċ import Ġcom . fasterxml . jackson . databind . Deserialization Feature Ċ import Ġcom . fasterxml . jackson . databind . Serialization Feature Ċ import Ġcom . fin you . fin track . backend . app . ktor . K tor Auth Config . Companion . GROUP S _ CL AIM Ċ import Ġcom . fin you . fin track . backend . app . ktor . controllers .* Ċ import Ġio . ktor . application .* Ċ import Ġio . ktor . auth .* Ċ import Ġio . ktor . auth . jwt .* Ċ import Ġio . ktor . features .* Ċ import Ġio . ktor . http .* Ċ import Ġio . ktor . jackson .* Ċ import Ġio . ktor . response .* Ċ import Ġio . ktor . routing .* Ċ import Ġio . ktor . server . netty .* Ċ import Ġio . ktor . websocket .* Ċ Ċ fun Ġmain ( args : ĠArray < String >): ĠUnit Ġ= ĠEngine Main . main ( args ) Ċ Ċ fun ĠApplication . module ( config : ĠApp K tor Config Ġ= ĠApp K tor Config ( ĊĠĠĠ Ġauth Ġ= ĠK tor Auth Config ( environment ) Ċ )) Ġ{ ĊĠĠĠ Ġinstall ( Default Headers ) ĊĠĠĠ Ġinstall ( Call Logging ) ĊĠĠĠ Ġinstall ( Auto Head Response ) ĊĠĠĠ Ġinstall ( Routing ) ĊĠĠĠ Ġinstall ( C ORS ) Ġ{ ĊĠĠĠĠĠĠĠ Ġmethod ( HttpMethod . Options ) ĊĠĠĠĠĠĠĠ Ġmethod ( HttpMethod . Put ) ĊĠĠĠĠĠĠĠ Ġmethod ( HttpMethod . Delete ) ĊĠĠĠĠĠĠĠ Ġmethod ( HttpMethod . Patch ) ĊĠĠĠĠĠĠĠ Ġheader ( HttpHeaders . Authorization ) ĊĠĠĠĠĠĠĠ Ġheader (" My Custom Header ") ĊĠĠĠĠĠĠĠ Ġallow Credentials Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġany Host () Ġ// Ġ@ TODO : ĠDon 't Ġdo Ġthis Ġin Ġproduction Ġif Ġpossible . ĠTry Ġto Ġlimit Ġit . ĊĠĠĠ Ġ} ĊĠĠĠ Ġinstall ( Content Neg otiation ) Ġ{ ĊĠĠĠĠĠĠĠ Ġj ack son Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdisable ( Deserialization Feature . FAIL _ ON _ UNKNOWN _ PROPERTIES ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġenable ( Serialization Feature . IND ENT _ OUTPUT ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwriter WithDefault PrettyPrinter () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġinstall ( WebSocket s ) ĊĠĠĠ Ġinstall ( Authentication ) Ġ{ ĊĠĠĠĠĠĠĠ Ġjwt (" auth - jwt ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrealm Ġ= Ġconfig . auth . realm ĊĠĠĠĠĠĠĠĠĠĠĠ Ġverifier ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠJWT ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. require ( Algorithm . HMAC 2 5 6 ( config . auth . secret )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. with Audience ( config . auth . audience ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. with Issuer ( config . auth . issuer ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvalidate Ġ{ Ġjwt Credential : ĠJ W TC redential Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ! jwt Credential . payload . audience . contains ( config . auth . audience ) Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlog . error (" Unsupported Ġaudience Ġin ĠJWT Ġtoken Ġ${ jwt Credential . payload . audience }. ĠMust Ġbe Ġ${ config . auth . audience }") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġjwt Credential . payload . issuer Ġ!= Ġconfig . auth . issuer Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlog . error (" Wrong Ġissuer Ġin ĠJWT Ġtoken Ġ${ jwt Credential . payload . issuer }. ĠMust Ġbe Ġ${ config . auth . issuer }") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġjwt Credential . payload . get Claim ( GROUP S _ CL AIM ). asList ( String :: class . java ). isNull OrEmpty () Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠJWT Principal ( jwt Credential . payload ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġservice Ġ= Ġconfig . fin Transaction Service ĊĠĠĠ Ġval ĠobjectMapper Ġ= Ġconfig . object Mapper ĊĠĠĠ Ġval Ġws User Sessions Ġ= Ġconfig . user Sessions ĊĊĠĠĠ Ġrouting Ġ{ ĊĠĠĠĠĠĠĠ Ġget ("/") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcall . respond Text (" Hello ĠWorld !") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġauthenticate (" auth - jwt ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġroute (" transaction ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpost (" init ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcall . init ( service ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpost (" create ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcall . create Fin Transaction ( service ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpost (" read ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcall . read Fin Transaction ( service ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpost (" update ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcall . update Fin Transaction ( service ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpost (" delete ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcall . delete Fin Transaction ( service ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpost (" search ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcall . search Fin Transaction ( service ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġweb Socket (" ws ") Ġ{ Ġhandle Session ( object Mapper , Ġservice , Ġws User Sessions ) Ġ} ĊĠĠĠ Ġ} Ċ }