package Ġk tor . example . auth . jwt Ċ Ċ import Ġio . ktor . application .* Ċ import Ġio . ktor . auth . Authentication Ċ import Ġio . ktor . auth . User Password Credential Ċ import Ġio . ktor . auth . authenticate Ċ import Ġio . ktor . auth . jwt . jwt Ċ import Ġio . ktor . features . Call Logging Ċ import Ġio . ktor . features . Content Neg otiation Ċ import Ġio . ktor . gson . gson Ċ import Ġio . ktor . request . receive Ċ import Ġio . ktor . response . respond Ċ import Ġio . ktor . response . respond Text Ċ import Ġio . ktor . routing .* Ċ import Ġorg . slf 4 j . Logger Ċ import Ġorg . slf 4 j . LoggerFactory ĊĊ Ċ fun ĠApplication . module () Ġ{ ĊĠĠĠ Ġinstall ( Call Logging ) ĊĠĠĠ Ġinstall ( Content Neg otiation ) Ġ{ Ġgson Ġ{ Ġ} Ġ} ĊĊĠĠĠ Ġval Ġuser Source : ĠUser Repo Ġ= ĠUser Repo Impl () ĊĠĠĠ Ġinstall ( Authentication ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠSetup Ġthe ĠJWT Ġauthentication Ġto Ġbe Ġused Ġin Ġ[ Routing ]. ĊĠĠĠĠĠĠĠĠ Ġ* ĠIf Ġthe Ġtoken Ġis Ġvalid , Ġthe Ġcorresponding Ġ[ User ] Ġis Ġfetched Ġfrom Ġthe Ġdatabase . ĊĠĠĠĠĠĠĠĠ Ġ* ĠThe Ġ[ User ] Ġcan Ġthen Ġbe Ġaccessed Ġin Ġeach Ġ[ Application Call ]. ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġjwt Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġverifier ( Jwt Config . verifier ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrealm Ġ= Ġ" ktor . io " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvalidate Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġid Ġ= Ġit . payload . get Claim (" id "). as Int () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlog . debug (" ID : Ġ$ id ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġid ?. let ( user Source :: find User ById ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinstall ( Routing ) Ġ{ ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠA Ġpublic Ġlogin Ġ[ Route ] Ġused Ġto Ġobtain ĠJWT s ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġpost (" login ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcredentials Ġ= Ġcall . receive < User Password Credential >() ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġuser Ġ= Ġuser Source . find User By Credentials ( credentials ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtoken Ġ= ĠJwt Config . make Token ( user ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcall . application . environment . log . info (" User Ġlogged Ġsuccessfully Ġand Ġreceiving ĠJWT Ġas : Ġ$ user ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcall . respond Text ( token ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠAll Ġ[ Route ] s Ġin Ġthe Ġauthentication Ġblock Ġare Ġsec ured . ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġauthenticate Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġroute (" secret - roles ") Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġget Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġuser Ġ= Ġcall . user !! ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcall . respond ( user . roles ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠRoutes Ġwith Ġoptional Ġauthentication ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġauthenticate ( optional Ġ= Ġtrue ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġget (" optional - auth ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġuser Ġ= Ġcall . user ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresponse Ġ= Ġif Ġ( user Ġ!= Ġnull ) Ġ" authenticated Ġas Ġ$ user " Ġelse Ġ" auth Ġis Ġoptional Ġhere Ġ..." ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcall . respond ( response ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ