package Ġio . ktor . auth Ċ Ċ import Ġio . ktor . application .* Ċ import Ġio . ktor . client .* Ċ import Ġio . ktor . client . call .* Ċ import Ġio . ktor . client . request .* Ċ import Ġio . ktor . client . response .* Ċ import Ġio . ktor . content .* Ċ import Ġio . ktor . http .* Ċ import Ġio . ktor . pipeline .* Ċ import Ġio . ktor . response .* Ċ import Ġio . ktor . util .* Ċ import Ġkotlinx . coroutines . experimental .* Ċ import Ġorg . json . simple .* Ċ import Ġjava . io .* Ċ import Ġjava . net .* Ċ Ċ internal Ġsuspend Ġfun ĠPipeline Context < Unit , ĠApplication Call >. oauth 2 ( ĊĠĠĠĠĠĠĠ Ġclient : ĠHttpClient , Ġdispatcher : ĠCor outine Dispatcher , ĊĠĠĠĠĠĠĠ Ġprovider Lookup : ĠApplication Call . () Ġ-> ĠOAuth Server Settings ?, ĊĠĠĠĠĠĠĠ Ġurl Provider : ĠApplication Call .( OAuth Server Settings ) Ġ-> ĠString Ċ ) Ġ{ ĊĠĠĠ Ġ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 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstate Provider Ġ= Ġprovider . state Provider ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcall . redirect Authenticate OAuth 2 ( provider , Ġcallback Redirect Url , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstate Ġ= Ġstate Provider . getState ( call ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġscopes Ġ= Ġprovider . default Scopes , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinterceptor Ġ= Ġprovider . authorize Url Interceptor ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwith Context ( dispatcher ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠaccessToken Ġ= Ġsimple OAuth 2 Step 2 ( client , Ġprovider , Ġcallback Redirect Url , Ġtoken ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcall . authentication . principal ( accessToken ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ internal Ġfun ĠApplication Call . oauth 2 Handle Callback (): ĠOAuth Callback . Token Single ? Ġ{ ĊĠĠĠ Ġval Ġcode Ġ= Ġparameters [ OAuth 2 Request Parameters . Code ] ĊĠĠĠ Ġval Ġstate Ġ= Ġparameters [ OAuth 2 Request Parameters . State ] ĊĊĠĠĠ Ġreturn Ġwhen Ġ{ ĊĠĠĠĠĠĠĠ Ġcode Ġ!= Ġnull Ġ&& Ġstate Ġ!= Ġnull Ġ-> ĠOAuth Callback . Token Single ( code , Ġstate ) ĊĠĠĠĠĠĠĠ Ġelse Ġ-> Ġnull ĊĠĠĠ Ġ} Ċ } Ċ Ċ internal Ġsuspend Ġfun ĠApplication Call . redirect Authenticate OAuth 2 ( settings : ĠOAuth Server Settings . OAuth 2 Server Settings , Ġcallback Redirect Url : ĠString , Ġstate : ĠString , Ġextra Parameters : ĠList < Pair < String , ĠString >> Ġ= Ġempty List (), Ġscopes : ĠList < String > Ġ= Ġempty List (), Ġinterceptor : ĠURL Builder . () Ġ-> ĠUnit ) Ġ{ ĊĠĠĠ Ġredirect Authenticate OAuth 2 ( authenticate Url Ġ= Ġsettings . authorize Url , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcallback Redirect Url Ġ= Ġcallback Redirect Url , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠclientId Ġ= Ġsettings . clientId , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstate Ġ= Ġstate , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġscopes Ġ= Ġscopes , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġparameters Ġ= Ġextra Parameters , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinterceptor Ġ= Ġinterceptor ) Ċ } Ċ Ċ internal Ġsuspend Ġfun Ġsimple OAuth 2 Step 2 ( client : ĠHttpClient , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsettings : ĠOAuth Server Settings . OAuth 2 Server Settings , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġused Redirect Url : ĠString , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcallback Response : ĠOAuth Callback . Token Single , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġextra Parameters : ĠMap < String , ĠString > Ġ= Ġempty Map (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconfigure : ĠHttpRequest Builder . () Ġ-> ĠUnit Ġ= Ġ{} ): ĠOAuth AccessToken Response . OAuth 2 Ġ{ ĊĠĠĠ Ġreturn Ġsimple OAuth 2 Step 2 ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġclient , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsettings . request Method , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġused Redirect Url , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsettings . accessToken Url , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsettings . clientId , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsettings . client Secret , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcallback Response . state , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcallback Response . token , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġextra Parameters , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġconfigure , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsettings . accessToken Requires Basic Auth , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsettings . state Provider ĊĠĠĠ Ġ) Ċ } Ċ Ċ private Ġsuspend Ġfun ĠApplication Call . redirect Authenticate OAuth 2 ( authenticate Url : ĠString , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcallback Redirect Url : ĠString , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠclientId : ĠString , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstate : ĠString , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġscopes : ĠList < String > Ġ= Ġempty List (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparameters : ĠList < Pair < String , ĠString >> Ġ= Ġempty List (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinterceptor : ĠURL Builder . () Ġ-> ĠUnit Ġ= Ġ{}) Ġ{ ĊĊĠĠĠ Ġval Ġurl Ġ= ĠURL Builder () ĊĠĠĠ Ġurl . take From ( URI ( authenticate Url )) ĊĠĠĠ Ġurl . parameters . apply Ġ{ ĊĠĠĠĠĠĠĠ Ġappend ( OAuth 2 Request Parameters . ClientId , ĠclientId ) ĊĠĠĠĠĠĠĠ Ġappend ( OAuth 2 Request Parameters . Redirect Uri , Ġcallback Redirect Url ) ĊĠĠĠĠĠĠĠ Ġif Ġ( scopes . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġappend ( OAuth 2 Request Parameters . Scope , Ġscopes . join ToString (" Ġ")) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġappend ( OAuth 2 Request Parameters . State , Ġstate ) ĊĠĠĠĠĠĠĠ Ġappend ( OAuth 2 Request Parameters . ResponseType , Ġ" code ") ĊĠĠĠĠĠĠĠ Ġparameters . forEach Ġ{ Ġ( k , Ġv ) Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġappend ( k , Ġv ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġinterceptor ( url ) ĊĊĠĠĠ Ġreturn Ġrespond Redirect ( url . build String ()) Ċ } Ċ Ċ private Ġsuspend Ġfun Ġsimple OAuth 2 Step 2 ( client : ĠHttpClient , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmethod : ĠHttpMethod , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġused Redirect Url : ĠString ?, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠbaseUrl : ĠString , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠclientId : ĠString , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġclient Secret : ĠString , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstate : ĠString ?, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcode : ĠString ?, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġextra Parameters : ĠMap < String , ĠString > Ġ= Ġempty Map (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconfigure : ĠHttpRequest Builder . () Ġ-> ĠUnit Ġ= Ġ{}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġuse Basic Auth : ĠBoolean Ġ= Ġfalse , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstate Provider : ĠOAuth 2 State Provider Ġ= ĠDefault OAuth 2 State Provider , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgrant Type : ĠString Ġ= ĠOAuth Grant Types . Authorization Code ): ĠOAuth AccessToken Response . OAuth 2 Ġ{ ĊĊĠĠĠ Ġif Ġ( state Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠ Ġstate Provider . verify State ( state ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġrequest Ġ= ĠHttpRequest Builder () ĊĠĠĠ Ġrequest . url . take From ( URI ( baseUrl )) ĊĊĠĠĠ Ġval Ġurl Parameters Ġ= ĠParameters Builder (). apply Ġ{ ĊĠĠĠĠĠĠĠ Ġappend ( OAuth 2 Request Parameters . ClientId , Ġ ĠclientId ) ĊĠĠĠĠĠĠĠ Ġappend ( OAuth 2 Request Parameters . Client Secret , Ġ Ġclient Secret ) ĊĠĠĠĠĠĠĠ Ġappend ( OAuth 2 Request Parameters . Grant Type , Ġ Ġgrant Type ) ĊĠĠĠĠĠĠĠ Ġif Ġ( state Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġappend ( OAuth 2 Request Parameters . State , Ġstate ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( code Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġappend ( OAuth 2 Request Parameters . Code , Ġcode ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( used Redirect Url Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġappend ( OAuth 2 Request Parameters . Redirect Uri , Ġused Redirect Url ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġextra Parameters . forEach Ġ{ Ġ( k , Ġv ) Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġappend ( k , Ġv ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġwhen Ġ( method ) Ġ{ ĊĠĠĠĠĠĠĠ ĠHttpMethod . Get Ġ-> Ġrequest . url . parameters . append All ( url Parameters ) ĊĠĠĠĠĠĠĠ ĠHttpMethod . Post Ġ-> Ġrequest . body Ġ= ĠText Content ( url Parameters . build (). form Url Encode (), ĠContentType . Application . Form Url Encoded ) ĊĠĠĠĠĠĠĠ Ġelse Ġ-> Ġthrow ĠUnsupportedOperationException (" Method Ġ$ method Ġis Ġnot Ġsupported . ĠUse ĠGET Ġor ĠPOST ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġrequest . apply Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . method Ġ= Ġmethod ĊĠĠĠĠĠĠĠ Ġheader ( HttpHeaders . Accept , ĠlistOf ( ContentType . Application . Form Url Encoded , ĠContentType . Application . Json ). join ToString ("," )) ĊĠĠĠĠĠĠĠ Ġif Ġ( use Basic Auth ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġheader ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠHttp Headers . Authorization , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠHttp Auth Header . Single ( Auth Scheme . Basic , Ġencode Base 6 4 ("$ clientId :$ client Secret ". toByteArray ( Charsets . ISO _ 8 8 5 9 _ 1 ))). render () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġconfigure () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġresponse Ġ= Ġclient . call ( request ). response ĊĊĠĠĠ Ġval Ġbody Ġ= Ġresponse . read Text () ĊĊĠĠĠ Ġval Ġ( contentType , Ġcontent ) Ġ= Ġtry Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( response . status Ġ== ĠHttpStatusCode . NotFound ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIOException (" Not Ġfound . ĠGot Ġ 4 0 4 Ġfor Ġthe Ġpage Ġ$ baseUrl ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval ĠcontentType Ġ= Ġresponse . headers [ HttpHeaders . ContentType ]?. let Ġ{ ĠContentType . parse ( it ) Ġ} Ġ?: ĠContentType . Any ĊĊĠĠĠĠĠĠĠ ĠPair ( contentType , Ġbody ) ĊĠĠĠ Ġ} Ġcatch Ġ( io e : ĠIOException ) Ġ{ ĊĠĠĠĠĠĠĠ Ġthrow Ġio e ĊĠĠĠ Ġ} Ġcatch Ġ( t : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠ Ġthrow ĠIOException (" Failed Ġto Ġacquire Ġrequest Ġtoken Ġdue Ġto Ġwrong Ġcontent : Ġ$ body ", Ġt ) ĊĠĠĠ Ġ} Ġfinally Ġ{ ĊĠĠĠĠĠĠĠ Ġresponse . close () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġcontent Decoded Ġ= Ġdecode Content ( content , ĠcontentType ) ĊĊĠĠĠ Ġif Ġ( content Decoded . contains ( OAuth 2 Response Parameters . Error )) Ġ{ ĊĠĠĠĠĠĠĠ Ġthrow ĠIOException (" OAuth Ġserver Ġrespon ded Ġwith Ġerror : Ġ$ content Decoded ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġreturn ĠOAuth AccessToken Response . OAuth 2 ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠaccessToken Ġ= Ġcontent Decoded [ OAuth 2 Response Parameters . AccessToken ] !! , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtoken Type Ġ= Ġcontent Decoded [ OAuth 2 Response Parameters . TokenType ] Ġ?: Ġ"", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexpires In Ġ= Ġcontent Decoded [ OAuth 2 Response Parameters . Expires In ]?. to Long () Ġ?: Ġ 0 L , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrefresh Token Ġ= Ġcontent Decoded [ OAuth 2 Response Parameters . RefreshToken ], ĊĠĠĠĠĠĠĠĠĠĠĠ Ġextra Parameters Ġ= Ġcontent Decoded ĊĠĠĠ Ġ) Ċ } Ċ Ċ private Ġfun Ġdecode Content ( content : ĠString , ĠcontentType : ĠContentType ): ĠParameters Ġ= Ġwhen Ġ{ ĊĠĠĠ ĠcontentType . match ( ContentType . Application . Form Url Encoded ) Ġ-> Ġcontent . parse Url Encoded Parameters () ĊĠĠĠ ĠcontentType . match ( ContentType . Application . Json ) Ġ-> ĠParameters . build Ġ{ ĊĠĠĠĠĠĠĠ Ġ( JSON Value . parse With Exception ( content ) Ġas ĠJSONObject ). forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġappend ( it . key . toString (), Ġit . value . toString ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ġ// ĠTODO Ġbetter Ġjson Ġhandling Ċ // ĠTODO Ġtext / xml ĊĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Ġsome Ġservers Ġmay Ġrespond Ġwith Ġwrong Ġcontent Ġtype Ġso Ġwe Ġhave Ġto Ġtry Ġto Ġguess ĊĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontent . startsWith ("{ ") Ġ&& Ġcontent . trim (). endsWith (" }") Ġ-> Ġdecode Content ( content . trim (), ĠContentType . Application . Json ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontent . matches (" ([ a - zA - Z \\ d _- ]+ =[ ^ =& ]+ & ? )+ ". to Regex ()) Ġ-> Ġdecode Content ( content , ĠContentType . Application . Form Url Encoded ) Ġ// ĠTODO Ġtoo Ġris ky , Ġisn 't Ġit ? ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġthrow ĠIOException (" unsupported Ġcontent Ġtype Ġ$ contentType ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ /** Ċ Ġ* ĠImplements ĠResource ĠOwner ĠPassword ĠCredentials ĠGrant Ċ Ġ* Ġsee Ġhttp :// tools . ietf . org / html / rfc 6 7 4 9 # section - 4 . 3 Ċ Ġ* Ċ Ġ* ĠTakes Ġ[ User Password Credential ] Ġand Ġvalidates Ġit Ġusing ĠOAuth 2 Ġsequence , Ġprovides Ġ[ OAuth AccessToken Response . OAuth 2 ] Ġif Ġsucceeds Ċ Ġ*/ Ċ suspend Ġfun Ġverify With OAuth 2 ( c : ĠUser Password Credential , Ġclient : ĠHttpClient , Ġsettings : ĠOAuth Server Settings . OAuth 2 Server Settings ): ĠOAuth AccessToken Response . OAuth 2 Ġ{ ĊĠĠĠ Ġreturn Ġsimple OAuth 2 Step 2 ( client , ĠHttpMethod . Post , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġused Redirect Url Ġ= Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠbaseUrl Ġ= Ġsettings . accessToken Url , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠclientId Ġ= Ġsettings . clientId , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġclient Secret Ġ= Ġsettings . client Secret , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcode Ġ= Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstate Ġ= Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġconfigure Ġ= Ġ{}, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġextra Parameters Ġ= Ġmap Of ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠOAuth 2 Request Parameters . UserName Ġto Ġc . name , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠOAuth 2 Request Parameters . Password Ġto Ġc . password ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġuse Basic Auth Ġ= Ġtrue , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstate Provider Ġ= Ġsettings . state Provider , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġgrant Type Ġ= ĠOAuth Grant Types . Password ĊĠĠĠ Ġ) Ċ } Ċ Ċ object ĠOAuth 2 Request Parameters Ġ{ ĊĠĠĠ Ġconst Ġval ĠClient Id Ġ= Ġ" client _ id " ĊĠĠĠ Ġconst Ġval ĠScope Ġ= Ġ" scope " ĊĠĠĠ Ġconst Ġval ĠClient Secret Ġ= Ġ" client _ secret " ĊĠĠĠ Ġconst Ġval ĠGrant Type Ġ= Ġ" grant _ type " ĊĠĠĠ Ġconst Ġval ĠCode Ġ= Ġ" code " ĊĠĠĠ Ġconst Ġval ĠState Ġ= Ġ" state " ĊĠĠĠ Ġconst Ġval ĠRedirect Uri Ġ= Ġ" redirect _ uri " ĊĠĠĠ Ġconst Ġval ĠResponse Type Ġ= Ġ" response _ type " ĊĠĠĠ Ġconst Ġval ĠUser Name Ġ= Ġ" username " ĊĠĠĠ Ġconst Ġval ĠPassword Ġ= Ġ" password " Ċ } Ċ Ċ object ĠOAuth 2 Response Parameters Ġ{ ĊĠĠĠ Ġconst Ġval ĠAccess Token Ġ= Ġ" access _ token " ĊĠĠĠ Ġconst Ġval ĠTokenType Ġ= Ġ" token _ type " ĊĠĠĠ Ġconst Ġval ĠExp ires In Ġ= Ġ" expires _ in " ĊĠĠĠ Ġconst Ġval ĠRefresh Token Ġ= Ġ" refresh _ token " ĊĠĠĠ Ġconst Ġval ĠError Ġ= Ġ" error " ĊĠĠĠ Ġconst Ġval ĠError Description Ġ= Ġ" error _ description " Ċ } Ċ