package Ġio . ktor . samples . auth Ċ Ċ import Ġio . ktor . client .* Ċ import Ġio . ktor . client . engine . mock .* Ċ import Ġio . ktor . content .* Ċ import Ġio . ktor . http .* Ċ import Ġio . ktor . server . testing .* Ċ import Ġorg . junit . Test Ċ import Ġkotlin . test .* Ċ Ċ class ĠOAuth Test Ġ{ ĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest OAuth Login () Ġ{ ĊĠĠĠĠĠĠĠ Ġwith Test Application Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlateinit Ġvar Ġstate : ĠString ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmock Engine Ġ= ĠMock Engine Ġ{ Ġrequest Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( request . url . full Url ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" https :// www . googleapis . com / oauth 2 / v 3 / token " Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtext Content Ġ= Ġrequest . body Ġas ĠText Content ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( ContentType . Application . Form Url Encoded , Ġtext Content . contentType ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" client _ id =% 2 A % 2 A % 2 A . apps . googleusercontent . com & client _ secret =% 2 A % 2 A % 2 A & grant _ type = authorization _ code & state =$ state & code = my code & redirect _ uri = http % 3 A % 2 F % 2 F 1 2 7 . 0 . 0 . 1 % 2 F login % 2 F google ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtext Content . text ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrespond (""" { ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" access _ token ": Ġ" my ac ces sto ken ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" token _ type ": Ġ" my tok ent ype ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" expires _ in ": Ġ 3 6 0 0 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" refresh _ token ": Ġ" my ref res ht o ken " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} """, Ġheaders Ġ= Ġheaders Of ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠHttp Headers . ContentType Ġto ĠlistOf ( ContentType . Application . Json . toString ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ)) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġerror (" Unhandled Ġ${ request . url . full Url }") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġapplication . OAuth Login Application With Deps ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoauth HttpClient Ġ= ĠHttpClient ( mock Engine ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġhandle Request ( HttpMethod . Get , Ġ"/ login / google ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd Header (" Host ", Ġ" 1 2 7 . 0 . 0 . 1 ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}. let Ġ{ Ġcall Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlocation Ġ= Ġcall . response . headers [" Location "] Ġ?: Ġ"" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" https :// accounts . google . com / o / oauth 2 / auth ? client _ id =% 2 A % 2 A % 2 A . apps . googleusercontent . com & redirect _ uri = http % 3 A % 2 F % 2 F 1 2 7 . 0 . 0 . 1 % 2 F login % 2 F google & scope = https % 3 A % 2 F % 2 F www . googleapis . com % 2 F auth % 2 F plus . login & state = **** & response _ type = code ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠRegex (" state =( \\ w +) "). replace ( location , Ġ" state = **** ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstate Info Ġ= ĠRegex (" state =( \\ w +) "). find ( location ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstate Ġ= Ġstate Info !!. group Values [ 1 ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġhandle Request ( HttpMethod . Get , Ġ"/ login / google ? state =$ state & code = my code ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd Header (" Host ", Ġ" 1 2 7 . 0 . 0 . 1 ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}. let Ġ{ Ġcall Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals (""" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ<! DOCTYPE Ġhtml > ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ< html > ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ< head > ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ< title > Logged Ġin </ title > ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ</ head > ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ< body > ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ< h 1 > You Ġare Ġlogged Ġin </ h 1 > ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ< p > Your Ġtoken Ġis ĠOAuth 2 ( accessToken = my ac ces sto ken , Ġtoken Type = my tok ent ype , Ġexpires In = 3 6 0 0 , Ġrefresh Token = my ref res ht o ken , Ġextra Parameters = Parameters Ġ[ access _ token =[ my ac ces sto ken ], Ġrefresh _ token =[ my ref res ht o ken ], Ġtoken _ type =[ my tok ent ype ], Ġexpires _ in =[ 3 6 0 0 ]]) </ p > ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ</ body > ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ</ html > ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ""" . trim Indent (), Ġcall . response . content ?. trim ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ private Ġval ĠUrl . host With Port If Required : ĠString Ġget () Ġ= Ġif Ġ( port Ġ== Ġprotocol . default Port ) Ġhost Ġelse Ġhost With Port Ċ private Ġval ĠUrl . full Url : ĠString Ġget () Ġ= Ġ"${ protocol . name } :// $ host With Port If Required $ fullPath " Ċ