package Ġio . ktor . auth Ċ Ċ import Ġio . ktor . application .* Ċ import Ġio . ktor . client .* Ċ import Ġjava . io .* Ċ Ċ val ĠOAuth Key : ĠAny Ġ= Ġ" OAuth " Ċ Ċ class ĠOAuth Authentication Provider ( name : ĠString ?) Ġ: ĠAuthentication Provider ( name ) Ġ{ ĊĠĠĠ Ġlateinit Ġvar Ġclient : ĠHttpClient ĊĠĠĠ Ġlateinit Ġvar Ġprovider Lookup : ĠApplication Call . () Ġ-> ĠOAuth Server Settings ? ĊĠĠĠ Ġlateinit Ġvar Ġurl Provider : ĠApplication Call .( OAuth Server Settings ) Ġ-> ĠString Ċ } Ċ Ċ /** Ċ Ġ* ĠInstall s ĠOAuth ĠAuthentication Ġmechanism Ċ Ġ*/ Ċ fun ĠAuthentication . Configuration . oauth ( name : ĠString ? Ġ= Ġnull , Ġconfigure : ĠOAuth Authentication Provider . () Ġ-> ĠUnit ) Ġ{ ĊĠĠĠ Ġval Ġprovider Ġ= ĠOAuth Authentication Provider ( name ). apply ( configure ) ĊĠĠĠ Ġprovider . oauth 1 a () ĊĠĠĠ Ġprovider . oauth 2 () ĊĠĠĠ Ġregister ( provider ) Ċ } Ċ Ċ internal Ġfun ĠOAuth Authentication Provider . oauth 2 () Ġ{ ĊĠĠĠ Ġpipeline . intercept ( Authentication Pipeline . Request Authentication ) Ġ{ Ġcontext Ġ-> ĊĠĠĠĠĠĠĠ Ġval Ġprovider Ġ= Ġcall . provider Lookup () ĊĠĠĠĠĠĠĠ Ġif Ġ( provider Ġis ĠOAuth Server Settings . OAuth 2 Server Settings ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtoken Ġ= Ġcall . oauth 2 Handle Callback () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcallback Redirect Url Ġ= Ġcall . url Provider ( provider ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( token Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontext . challenge ( OAuth Key , ĠAuthentication Failed Cause . No Credentials ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcall . redirect Authenticate OAuth 2 ( provider , Ġcallback Redirect Url , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstate Ġ= Ġprovider . state Provider . getState ( call ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġscopes Ġ= Ġprovider . default Scopes , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinterceptor Ġ= Ġprovider . authorize Url Interceptor ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . complete () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwith IOException ( context ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠaccessToken Ġ= Ġsimple OAuth 2 Step 2 ( client , Ġprovider , Ġcallback Redirect Url , Ġtoken ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontext . principal ( accessToken ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ internal Ġfun ĠOAuth Authentication Provider . oauth 1 a () Ġ{ ĊĠĠĠ Ġpipeline . intercept ( Authentication Pipeline . Request Authentication ) Ġ{ Ġcontext Ġ-> ĊĠĠĠĠĠĠĠ Ġval Ġprovider Ġ= Ġcall . provider Lookup () ĊĠĠĠĠĠĠĠ Ġif Ġ( provider Ġis ĠOAuth Server Settings . OAuth 1 a Server Settings ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtoken Ġ= Ġcall . oauth 1 a Handle Callback () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( token Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontext . challenge ( OAuth Key , ĠAuthentication Failed Cause . No Credentials ) Ġ{ Ġch Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwith IOException ( context ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġt Ġ= Ġsimple OAuth 1 a Step 1 ( client , Ġprovider , Ġcall . url Provider ( provider )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcall . redirect Authenticate OAuth 1 a ( provider , Ġt ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġch . complete () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwith IOException ( context ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠaccessToken Ġ= Ġsimple OAuth 1 a Step 2 ( client , Ġprovider , Ġtoken ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontext . principal ( accessToken ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ private Ġsuspend Ġfun Ġwith IOException ( context : ĠAuthentication Context , Ġblock : Ġsuspend Ġ() Ġ-> ĠUnit ) Ġ{ ĊĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠ Ġblock () ĊĠĠĠ Ġ} Ġcatch Ġ( io e : ĠIOException ) Ġ{ ĊĠĠĠĠĠĠĠ Ġcontext . error ( OAuth Key , ĠAuthentication Failed Cause . Error ( io e . message Ġ?: Ġ" IOException ")) ĊĠĠĠ Ġ} Ċ } Ċ