package Ġno . nav . sy fo . client . azure ad . v 2 Ċ Ċ import Ġio . ktor . client . call .* Ċ import Ġio . ktor . client . features .* Ċ import Ġio . ktor . client . request .* Ċ import Ġio . ktor . client . request . forms .* Ċ import Ġio . ktor . client . statement .* Ċ import Ġio . ktor . http .* Ċ import Ġkotlinx . coroutines . sync . Mutex Ċ import Ġkotlinx . coroutines . sync . with Lock Ċ import Ġno . nav . sy fo . client . httpClient Proxy Ċ import Ġorg . slf 4 j . LoggerFactory Ċ Ċ class ĠAzure Ad V 2 Client ( ĊĠĠĠ Ġprivate Ġval Ġazure App ClientId : ĠString , ĊĠĠĠ Ġprivate Ġval Ġazure App Client Secret : ĠString , ĊĠĠĠ Ġprivate Ġval Ġazure Token Endpoint : ĠString , Ċ ) Ġ{ ĊĠĠĠ Ġprivate Ġval ĠhttpClient Ġ= ĠhttpClient Proxy () ĊĊĠĠĠ Ġprivate Ġval Ġmutex Ġ= ĠMutex () ĊĊĠĠĠ Ġ@ Volatile ĊĠĠĠ Ġprivate Ġvar Ġtoken Map Ġ= ĠHashMap < String , ĠAzure Ad V 2 Token >() ĊĊĠĠĠ Ġsuspend Ġfun Ġget On Be half Of Token ( ĊĠĠĠĠĠĠĠ Ġscope ClientId : ĠString , ĊĠĠĠĠĠĠĠ Ġtoken : ĠString , ĊĠĠĠ Ġ): ĠAzure Ad V 2 Token ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġget AccessToken ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠParameters . build Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġappend (" client _ id ", Ġazure App ClientId ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġappend (" client _ secret ", Ġazure App Client Secret ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġappend (" client _ assertion _ type ", Ġ" urn : ietf : params : oauth : grant - type : jwt - bearer ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġappend (" grant _ type ", Ġ" urn : ietf : params : oauth : grant - type : jwt - bearer ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġappend (" assertion ", Ġtoken ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġappend (" scope ", Ġ" api :// $ scope ClientId /. default ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġappend (" requested _ token _ use ", Ġ" on _ be half _ of ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ) ?. to Azure Ad V 2 Token () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġsuspend Ġfun Ġget System Token ( scope ClientId : ĠString ): ĠAzure Ad V 2 Token ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġmutex . with Lock Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtoken Map [ scope ClientId ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ? . take Unless Ġ{ Ġcached Token Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcached Token . is Expired () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġrun Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġget AccessToken ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠParameters . build Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġappend (" client _ id ", Ġazure App ClientId ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġappend (" client _ secret ", Ġazure App Client Secret ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġappend (" grant _ type ", Ġ" client _ credentials ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġappend (" scope ", Ġ" api :// $ scope ClientId /. default ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġazure ad Token Ġ= Ġit . to Azure Ad V 2 Token () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtoken Map [ scope ClientId ] Ġ= Ġazure ad Token ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġazure ad Token ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġsuspend Ġfun Ġget AccessToken ( ĊĠĠĠĠĠĠĠ Ġform Parameters : ĠParameters , ĊĠĠĠ Ġ): ĠAzure Ad V 2 Token Response ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresponse : ĠHttpResponse Ġ= ĠhttpClient . post ( azure Token Endpoint ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġaccept ( ContentType . Application . Json ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbody Ġ= ĠFormData Content ( form Parameters ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresponse . receive < Azure Ad V 2 Token Response >() ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠClient RequestException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhandle Unexpected Response Exception ( e ) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠServer Response Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhandle Unexpected Response Exception ( e ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġhandle Unexpected Response Exception ( ĊĠĠĠĠĠĠĠ Ġresponse Exception : ĠResponse Exception , ĊĠĠĠ Ġ): ĠAzure Ad V 2 Token Response ? Ġ{ ĊĠĠĠĠĠĠĠ Ġlog . error ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" Error Ġwhile Ġrequesting ĠAzure Ad AccessToken Ġwith ĠstatusCode =${ response Exception . response . status . value }", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresponse Exception ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġlog Ġ= ĠLoggerFactory . getLogger ( Azure Ad V 2 Client :: class . java ) ĊĠĠĠ Ġ} Ċ } Ċ