package Ġno . nav . sy fo . application Ċ Ċ import Ġcom . auth 0 . j wk . J wk Provider Ċ import Ġio . ktor . application . Application Ċ import Ġio . ktor . application . install Ċ import Ġio . ktor . auth . Authentication Ċ import Ġio . ktor . auth . Principal Ċ import Ġio . ktor . auth . jwt . JW TC redential Ċ import Ġio . ktor . auth . jwt . JWT Principal Ċ import Ġio . ktor . auth . jwt . jwt Ċ import Ġnet . logstash . log back . argument . Structured Arguments Ċ import Ġno . nav . sy fo . Pre Authorized Client Ċ import Ġno . nav . sy fo . log Ċ Ċ fun ĠApplication . setup Auth ( ĊĠĠĠ Ġj wk Provider : ĠJ wk Provider , ĊĠĠĠ Ġissuer : ĠString , ĊĠĠĠ Ġlogin service Id port en Audience : ĠString , ĊĠĠĠ Ġa ad Provider : ĠJ wk Provider , ĊĠĠĠ Ġa ad Issuer : ĠString , ĊĠĠĠ Ġa ad ClientId : ĠString , ĊĠĠĠ Ġa ad Pre authorized Apps : ĠList < Pre Authorized Client > Ċ ) Ġ{ ĊĠĠĠ Ġinstall ( Authentication ) Ġ{ ĊĠĠĠĠĠĠĠ Ġjwt ( name Ġ= Ġ" jwt ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġverifier ( j wk Provider , Ġissuer ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvalidate Ġ{ Ġcredentials : ĠJ W TC redential Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! has Expected Audience ( credentials , Ġlogin service Id port en Audience )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlog . warn (" Auth : ĠUnexpected Ġaudience : Ġexpected : Ġ$ login service Id port en Audience ĠActual : Ġ${ credentials . payload . audience }") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ validate Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! er N iva 4 ( credentials )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlog . warn (" Auth : ĠI k ke Ġn iv Ã¥ Ġ 4 ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ validate Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ validate ĠJWT Principal ( credentials . payload ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġjwt ( name Ġ= Ġ" aad ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġverifier ( aad Provider , Ġa ad Issuer ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvalidate Ġ{ Ġcredentials Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! has Expected Audience ( credentials , Ġa ad ClientId )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlog . warn (" Auth : ĠUnexpected Ġaudience : Ġexpected : Ġ$ aad ClientId ĠActual : Ġ${ credentials . payload . audience }") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ validate Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġaz p Claim Ġ= Ġcredentials . payload . get Claim (" az p "). asString () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġexpected Client Ids Ġ= Ġa ad Pre authorized Apps . map Ġ{ Ġit . clientId Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! expected Client Ids . contains ( az p Claim )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlog . warn (" Auth : ĠUnexpected Ġaz p : Ġexpected : Ġ$ expected Client Ids ĠActual : Ġ$ az p Claim ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ validate Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ validate ĠJWT Principal ( credentials . payload ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } ĊĊĊ Ċ fun Ġhas Expected Audience ( credentials : ĠJ W TC redential , Ġlogin service Id port en Audience : ĠString ): ĠBoolean Ġ{ ĊĠĠĠ Ġreturn Ġcredentials . payload . audience . contains ( login service Id port en Audience ) Ċ } Ċ Ċ fun Ġer N iva 4 ( credentials : ĠJ W TC redential ): ĠBoolean Ġ{ ĊĠĠĠ Ġreturn Ġ" Level 4 " Ġ== Ġcredentials . payload . get Claim (" acr "). asString () Ċ } Ċ