/* Ċ Ġ* ĠMIT ĠLicense Ċ Ġ* Ċ Ġ* ĠCopyright Ġ( c ) Ġ 2 0 1 7 ĠAnd ers ĠM ikk els en Ċ Ġ* Ċ Ġ* ĠPermission Ġis Ġhereby Ġgranted , Ġfree Ġof Ġcharge , Ġto Ġany Ġperson Ġobtaining Ġa Ġcopy Ċ Ġ* Ġof Ġthis Ġsoftware Ġand Ġassociated Ġdocumentation Ġfiles Ġ( the Ġ" Software "), Ġto Ġdeal Ċ Ġ* Ġin Ġthe ĠSoftware Ġwithout Ġrestriction , Ġincluding Ġwithout Ġlimitation Ġthe Ġrights Ċ Ġ* Ġto Ġuse , Ġcopy , Ġmodify , Ġmerge , Ġpublish , Ġdistribute , Ġsublicense , Ġand / or Ġsell Ċ Ġ* Ġcopies Ġof Ġthe ĠSoftware , Ġand Ġto Ġpermit Ġpersons Ġto Ġwhom Ġthe ĠSoftware Ġis Ċ Ġ* Ġfurnished Ġto Ġdo Ġso , Ġsubject Ġto Ġthe Ġfollowing Ġconditions : Ċ Ġ* Ċ Ġ* ĠThe Ġabove Ġcopyright Ġnotice Ġand Ġthis Ġpermission Ġnotice Ġshall Ġbe Ġincluded Ġin Ġall Ċ Ġ* Ġcopies Ġor Ġsubstantial Ġportions Ġof Ġthe ĠSoftware . Ċ Ġ* Ċ Ġ* ĠTHE ĠSOFTWARE ĠIS ĠPROVIDED Ġ" AS ĠIS ", ĠWITHOUT ĠWARRANTY ĠOF ĠANY ĠKIND , ĠEXPRESS ĠOR Ċ Ġ* ĠIMPLIED , ĠINCLUDING ĠBUT ĠNOT ĠLIMITED ĠTO ĠTHE ĠWARRANTIES ĠOF ĠMERCHANTABILITY , Ċ Ġ* ĠFITNESS ĠFOR ĠA ĠPARTICULAR ĠPURPOSE ĠAND ĠNONINFRINGEMENT . ĠIN ĠNO ĠEVENT ĠSHALL ĠTHE Ċ Ġ* ĠAUTHORS ĠOR ĠCOPYRIGHT ĠHOLDERS ĠBE ĠLIABLE ĠFOR ĠANY ĠCLAIM , ĠDAMAGES ĠOR ĠOTHER Ċ Ġ* ĠLIABILITY , ĠWHETHER ĠIN ĠAN ĠACTION ĠOF ĠCONTRACT , ĠTORT ĠOR ĠOTHERWISE , ĠARISING ĠFROM , Ċ Ġ* ĠOUT ĠOF ĠOR ĠIN ĠCONNECTION ĠWITH ĠTHE ĠSOFTWARE ĠOR ĠTHE ĠUSE ĠOR ĠOTHER ĠDEALINGS ĠIN ĠTHE Ċ Ġ* ĠSOFTWARE . Ċ Ġ*/ Ċ Ċ package Ġcom . n anno q . tools . auth . services Ċ Ċ import Ġcom . google . api . client . googleapis . auth . oauth 2 . Google Id Token Ċ import Ġcom . n anno q . tools . auth . Auth Globals . GLOBAL _ AUTHORIZATION Ċ import Ġcom . n anno q . tools . auth . Auth Globals . JWT _ CL AIM S _ EMAIL _ VER IFI ED Ċ import Ġcom . n anno q . tools . auth . Auth Globals . JWT _ CL AIM S _ FAMILY _ NAME Ċ import Ġcom . n anno q . tools . auth . Auth Globals . JWT _ CL AIM S _ G IV EN _ NAME Ċ import Ġcom . n anno q . tools . auth . Auth Globals . JWT _ CL AIM S _ NAME Ċ import Ġcom . n anno q . tools . auth . Auth Globals . JWT _ CL AIM S _ USER _ EMAIL Ċ import Ġcom . n anno q . tools . auth . Auth Globals . VALID _ JWT _ REGISTRY _ KEY Ċ import Ġcom . n anno q . tools . auth . models . Auth Package Ċ import Ġcom . n anno q . tools . auth . models . Token Container Ċ import Ġcom . n anno q . tools . auth . models . UserProfile Ċ import Ġcom . n anno q . tools . auth . services . providers . Face Book Provider Ċ import Ġcom . n anno q . tools . auth . services . providers . Google Ċ import Ġcom . n anno q . tools . auth . services . providers . Inst a Gram Ċ import Ġcom . n anno q . tools . auth . services . providers . utils . Google User Ċ import Ġcom . n anno q . tools . auth . utils . Auth F utures . auth Fail Ċ import Ġcom . n anno q . tools . auth . utils . Permission Pack Ċ import Ġcom . n anno q . tools . repository . models . Model Utils Ċ import Ġcom . n anno q . tools . repository . repository . redis . Redis Utils Ċ import Ġio . json web token . Claims Ċ import Ġio . json web token . Compression Code cs . DE FL ATE Ċ import Ġio . json web token . J ws Ċ import Ġio . json web token . Jwt Exception Ċ import Ġio . json web token . Jw ts Ċ import Ġio . json web token . Signature Algorithm Ċ import Ġio . vertx . codegen . annotations . Fluent Ċ import Ġio . vertx . core . AsyncResult Ċ import Ġio . vertx . core . Future Ċ import Ġio . vertx . core . Future . future Ċ import Ġio . vertx . core . Future . succeeded Future Ċ import Ġio . vertx . core . Handler Ċ import Ġio . vertx . core . Vert x Ċ import Ġio . vertx . core . json . Decode Exception Ċ import Ġio . vertx . core . json . Json Ċ import Ġio . vertx . core . json . JsonObject Ċ import Ġio . vertx . core . logging . LoggerFactory Ċ import Ġio . vertx . redis . Redis Client Ċ import Ġio . vertx . service proxy . ServiceException Ċ import Ġio . vertx . service proxy . ServiceException . fail Ċ import Ġjava . security . Invalid Key Exception Ċ import Ġjava . security . NoSuch AlgorithmException Ċ import Ġjava . util . Abstract Map . Simple Entry Ċ import Ġjava . util . Calendar Ċ import Ġjava . util . Date Ċ import Ġjava . util . UUID Ċ import Ġjava . util . function . Function Ċ import Ġjava . util . stream . Collectors . to Concurrent Map Ċ import Ġjavax . crypto . Mac Ċ import Ġjavax . crypto . SecretKey Ċ import Ġjavax . crypto . spec . SecretKey Spec Ċ import Ġorg . apache . commons . codec . digest . Digest Utils Ċ import Ġorg . apache . logging . log 4 j . core . config . plugins . convert . Hex Converter . parse Hex Binary Ċ Ċ @ Suppress (" unused ") Ċ /** Ċ Ġ* ĠThis Ġclass Ġdefines Ġan Ġauth enticator . ĠThe Ġauth enticator Ġreceives Ġan Ġexternal Ġtoken Ġand Ġconverts Ġit Ġinto Ġan Ġinternal Ċ Ġ* ĠJWT . Ċ Ġ* Ċ Ġ* Ġ@ author ĠAnd ers ĠM ikk els en Ċ Ġ* Ġ@ version Ġ 1 3 / 1 1 / 1 7 Ċ Ġ*/ Ċ class ĠAuthentication ServiceImpl Ġ@ Throws ( Invalid Key Exception :: class , ĠNoSuch AlgorithmException :: class ) Ċ constructor ( ĊĠĠĠ Ġvert x : ĠVert x , ĊĠĠĠ Ġapp Config : ĠJsonObject , ĊĠĠĠ Ġprivate Ġval Ġset Permission On Claims : ĠFunction < Permission Pack , ĠMutable Map < String , ĠAny >>, ĊĠĠĠ ĠKEY _ BASE : ĠString Ċ ) Ġ: ĠAuthentication Service Ġ{ ĊĠĠĠ Ġprivate Ġval ĠCALL BACK _ URL : ĠString ĊĠĠĠ Ġprivate Ġval ĠE MAIL _ HASH _ KEY _ BASE : ĠString ĊĊĠĠĠ Ġprivate Ġval ĠISS U ER : ĠString ĊĠĠĠ Ġprivate Ġval ĠA U DI ENCE : ĠString ĊĊĠĠĠ Ġprivate Ġval Ġredis Client : ĠRedis Client Ġ= ĠRedis Utils . get Redis Client ( vertx , Ġapp Config ) ĊĠĠĠ Ġprivate Ġval Ġdomain Identifier : ĠString Ġ= Ġapp Config . getString (" domain Identifier ") ĊĠĠĠ Ġprivate Ġval ĠSIGN ING _ KEY : ĠSecret Key ĊĊĠĠĠ Ġprivate Ġvar Ġnot Before TimeIn Minutes Ġ= Ġ- 5 ĊĠĠĠ Ġprivate Ġvar Ġid Token Expiration In Days Ġ= Ġ 5 ĊĠĠĠ Ġprivate Ġvar Ġrefresh Token Expiration In Days Ġ= Ġ 3 0 ĊĠĠĠ Ġprivate Ġval Ġgoogle Provider : ĠGoogle ĊĠĠĠ Ġprivate Ġval Ġfacebook Provider : ĠFace Book Provider ĊĠĠĠ Ġprivate Ġval Ġinst a Gram Provider : ĠInst a Gram ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . SIGN ING _ KEY Ġ= ĠSecret KeySpec ( parse Hex Binary ( KEY _ BASE ), ĠKEY _ ALGORITHM ) ĊĠĠĠĠĠĠĠ Ġthis . EMAIL _ HASH _ KEY _ BASE Ġ= Ġapp Config . getString (" email Hash Key base ") ĊĠĠĠĠĠĠĠ Ġval ĠCALL _ BACK _ PROVIDER _ URL Ġ= Ġapp Config . getString (" callback Provider Url ") ĊĠĠĠĠĠĠĠ Ġthis . CALLBACK _ URL Ġ= Ġapp Config . getString (" call Back Root ") Ġ+ ĠCALL _ BACK _ PROVIDER _ URL ĊĠĠĠĠĠĠĠ Ġthis . IS SU ER Ġ= Ġapp Config . getString (" auth JW TI ss uer ") ĊĠĠĠĠĠĠĠ Ġthis . AU DI ENCE Ġ= Ġapp Config . getString (" auth JW TA ud ience ") ĊĠĠĠĠĠĠĠ Ġthis . google Provider Ġ= ĠGoogle ( vertx ) ĊĠĠĠĠĠĠĠ Ġval ĠGOOGLE _ CLIENT _ IDS Ġ= Ġapp Config . get JsonArray (" gcm Ids "). list . map Ġ{ Ġit . toString () Ġ} ĊĠĠĠĠĠĠĠ Ġthis . google Provider . with Client Ids ( GOOGLE _ CLIENT _ IDS ) ĊĠĠĠĠĠĠĠ Ġthis . facebook Provider Ġ= ĠFace Book Provider ( vertx , Ġapp Config ) ĊĠĠĠĠĠĠĠ Ġthis . inst a Gram Provider Ġ= ĠInst a Gram ( vertx , Ġapp Config , ĠCALL BACK _ URL ) ĊĊĠĠĠĠĠĠĠ Ġinitialize Key ( KEY _ ALGORITHM ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Fluent ĊĠĠĠ Ġprivate Ġfun Ġset Not Before TimeIn Minutes ( not Before TimeIn Minutes : ĠInt ): ĠAuthentication ServiceImpl Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . not Before TimeIn Minutes Ġ= Ġnot Before TimeIn Minutes ĊĊĠĠĠĠĠĠĠ Ġreturn Ġthis ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Fluent ĊĠĠĠ Ġprivate Ġfun ĠsetId Token Expiration In Days ( id Token Expiration In Days : ĠInt ): ĠAuthentication ServiceImpl Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . id Token Expiration In Days Ġ= Ġid Token Expiration In Days ĊĊĠĠĠĠĠĠĠ Ġreturn Ġthis ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Fluent ĊĠĠĠ Ġprivate Ġfun Ġset RefreshToken Expiration In Days ( refresh Token Expiration In Days : ĠInt ): ĠAuthentication ServiceImpl Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . refresh Token Expiration In Days Ġ= Ġrefresh Token Expiration In Days ĊĊĠĠĠĠĠĠĠ Ġreturn Ġthis ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Fluent ĊĠĠĠ Ġprivate Ġfun Ġset Key Algorithm ( key Algorithm : ĠString ): ĠAuthentication ServiceImpl Ġ{ ĊĠĠĠĠĠĠĠ ĠKEY _ ALGORITHM Ġ= Ġkey Algorithm ĊĊĠĠĠĠĠĠĠ Ġreturn Ġthis ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Fluent ĊĠĠĠ Ġfun Ġwith Not Before TimeIn Minutes ( not Before Time : ĠInt ): ĠAuthentication ServiceImpl Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġset Not Before TimeIn Minutes ( not Before Time ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Fluent ĊĠĠĠ Ġfun Ġwith Id Token Expiration In Days ( id Token Expiration : ĠInt ): ĠAuthentication ServiceImpl Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠsetId Token Expiration In Days ( id Token Expiration ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Fluent ĊĠĠĠ Ġfun Ġwith RefreshToken Expiration In Days ( refresh Token Expiration : ĠInt ): ĠAuthentication ServiceImpl Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġset RefreshToken Expiration In Days ( refresh Token Expiration ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Fluent ĊĠĠĠ Ġfun Ġwith Key Algorithm ( key Algorithm : ĠString ): ĠAuthentication ServiceImpl Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġset Key Algorithm ( key Algorithm ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Throws ( NoSuch AlgorithmException :: class , ĠInvalid Key Exception :: class ) ĊĠĠĠ Ġprivate Ġfun Ġinitialize Key ( key Algorithm : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġmac Ġ= ĠMac . getInstance ( key Algorithm ) ĊĠĠĠĠĠĠĠ Ġmac . init ( SIGN ING _ KEY ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Fluent ĊĠĠĠ Ġoverride Ġfun Ġcreate Jwt From Provider ( ĊĠĠĠĠĠĠĠ Ġtoken : ĠString , ĊĠĠĠĠĠĠĠ Ġauth Provider : ĠString , ĊĠĠĠĠĠĠĠ Ġresult Handler : ĠHandler < AsyncResult < Auth Package >> ĊĠĠĠ Ġ): ĠAuthentication Service Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġunable To ParseException Ġ= Ġfail < Auth Package >( 5 0 0 , Ġ" Unable Ġto Ġparse ĠToken : Ġ") ĊĊĠĠĠĠĠĠĠ Ġwhen Ġ( auth Provider . toUpperCase ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠGOOGLE Ġ-> Ġgoogle Provider . check JWT ( token , ĠHandler Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . failed () Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . error (" Unable Ġto Ġprocess ĠGoogle ĠToken !", Ġit . cause ()) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult Handler . handle ( unable To ParseException ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġbuild Auth Package ( it . result (), ĠHandler Ġ{ Ġresult Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult Handler . handle ( succeeded Future ( result . result ())) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠFACE BOOK Ġ-> Ġfacebook Provider . check JWT ( token , ĠHandler Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . failed () Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . error (" Unable Ġto Ġprocess ĠFacebook ĠToken !", Ġit . cause ()) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult Handler . handle ( unable To ParseException ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġbuild Auth Package ( it . result (), ĠHandler Ġ{ Ġresult Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult Handler . handle ( succeeded Future ( result . result ())) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠINST AG RAM Ġ-> Ġinst a Gram Provider . check JWT ( token , ĠHandler Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . failed () Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . error (" Unable Ġto Ġprocess ĠInst agram ĠToken !", Ġit . cause ()) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult Handler . handle ( unable To ParseException ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġbuild Auth Package ( it . result (), ĠHandler Ġ{ Ġresult Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult Handler . handle ( succeeded Future ( result . result ())) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . error (" ERROR ĠJwt Generator : ĠUnknown ĠAuth Provider : Ġ$ auth Provider ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult Handler . handle ( fail ( 4 0 0 , Ġ" Unknown ĠProvider ... ")) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġthis ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġbuild Auth Package ( user Profile : ĠUser Profile , Ġresult Handler : ĠHandler < AsyncResult < Auth Package >>) Ġ{ ĊĠĠĠĠĠĠĠ Ġval ĠuserId Ġ= Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠModel Utils . hash String ( user Profile . email Ġ+ ĠE MAIL _ HASH _ KEY _ BASE ) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠNoSuch AlgorithmException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . error (" No Ġsuch Ġalg ", Ġe ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġuser Profile . email ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġuser Profile . userId Ġ= ĠuserId ĊĊĠĠĠĠĠĠĠ Ġval Ġclaims Map Ġ= Ġcreate Claims Map ( user Profile ) ĊĠĠĠĠĠĠĠ Ġval Ġemail Ġ= Ġuser Profile . email ĊĊĠĠĠĠĠĠĠ Ġdo Token Creation ( user Profile , Ġresult Handler , Ġclaims Map , Ġemail ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġbuild Auth Package ( ĊĠĠĠĠĠĠĠ Ġresult : ĠGoogle Id Token . Payload , ĊĠĠĠĠĠĠĠ Ġresult Handler : ĠHandler < AsyncResult < Auth Package >> ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġclaims Ġ= Ġmutable Map Of < String , ĠAny >() ĊĠĠĠĠĠĠĠ Ġclaims [ JWT _ CL AIM S _ USER _ EMAIL ] Ġ= Ġresult . email ĊĠĠĠĠĠĠĠ Ġclaims [ JWT _ CL AIM S _ NAME ] Ġ= Ġresult [" name "] Ġ?: Ġ" N / A " ĊĠĠĠĠĠĠĠ Ġclaims [ JWT _ CL AIM S _ G IV EN _ NAME ] Ġ= Ġresult [" given _ name "] Ġ?: Ġ" N / A " ĊĠĠĠĠĠĠĠ Ġclaims [ JWT _ CL AIM S _ FAMILY _ NAME ] Ġ= Ġresult [" family _ name "] Ġ?: Ġ" N / A " ĊĠĠĠĠĠĠĠ Ġclaims [ JWT _ CL AIM S _ EMAIL _ VER IFI ED ] Ġ= Ġresult [" email _ verified "] Ġ?: Ġ" N / A " ĊĊĠĠĠĠĠĠĠ Ġval Ġuser Profile Ġ= ĠGoogle User ( result ) ĊĠĠĠĠĠĠĠ Ġval ĠuserId Ġ= Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠModel Utils . hash String ( user Profile . email Ġ+ ĠE MAIL _ HASH _ KEY _ BASE ) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠNoSuch AlgorithmException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . error (" No Ġsuch Ġalg ", Ġe ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġuser Profile . email ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġuser Profile . userId Ġ= ĠuserId ĊĊĠĠĠĠĠĠĠ Ġval Ġemail Ġ= Ġresult . email ĊĊĠĠĠĠĠĠĠ Ġdo Token Creation ( user Profile , Ġresult Handler , Ġclaims , Ġemail ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġdo Token Creation ( ĊĠĠĠĠĠĠĠ Ġuser Profile : ĠUser Profile , ĊĠĠĠĠĠĠĠ Ġresult Handler : ĠHandler < AsyncResult < Auth Package >>, ĊĠĠĠĠĠĠĠ Ġclaims Map : ĠMutable Map < String , ĠAny >, ĊĠĠĠĠĠĠĠ Ġemail : ĠString ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġcreate Token Container ( email , Ġclaims Map , ĠHandler Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . result () Ġ!= Ġnull Ġ-> Ġresult Handler . handle ( succeeded Future ( Auth Package ( it . result (), Ġuser Profile ))) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . error (" Token Container Ġis Ġnull ...", Ġit . cause ()) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult Handler . handle ( fail ( 5 0 0 , Ġ" Token Container Ġis Ġnull ... ")) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcreate Claims Map ( result : ĠUser Profile ): ĠMutable Map < String , ĠAny > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġclaims Ġ= ĠHashMap < String , ĠAny >() ĊĠĠĠĠĠĠĠ Ġclaims [ JWT _ CL AIM S _ USER _ EMAIL ] Ġ= Ġresult . email ĊĠĠĠĠĠĠĠ Ġclaims [ JWT _ CL AIM S _ NAME ] Ġ= Ġresult . name ĊĠĠĠĠĠĠĠ Ġclaims [ JWT _ CL AIM S _ G IV EN _ NAME ] Ġ= Ġresult . given Name ĊĠĠĠĠĠĠĠ Ġclaims [ JWT _ CL AIM S _ FAMILY _ NAME ] Ġ= Ġresult . family Name ĊĠĠĠĠĠĠĠ Ġclaims [ JWT _ CL AIM S _ EMAIL _ VER IFI ED ] Ġ= Ġresult . is Email Verified ĊĊĠĠĠĠĠĠĠ Ġreturn Ġclaims ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcreate Token Container ( ĊĠĠĠĠĠĠĠ Ġemail : ĠString , ĊĠĠĠĠĠĠĠ Ġclaims : ĠMutable Map < String , ĠAny >, ĊĠĠĠĠĠĠĠ Ġresult Handler : ĠHandler < AsyncResult < Token Container >> ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġnew Claims Ġ= Ġclaims ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġid Ġ= ĠModel Utils . hash String ( email Ġ+ ĠE MAIL _ HASH _ KEY _ BASE ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnow Ġ= ĠCalendar . getInstance () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcalendar Ġ= ĠCalendar . getInstance () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcalendar . add ( Calendar . DAY _ OF _ MONTH , Ġid Token Expiration In Days ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnot Before Ġ= ĠCalendar . getInstance () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnot Before . add ( Calendar . MINUTE , Ġnot Before TimeIn Minutes ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġjwt Id Ġ= ĠUUID . randomUUID (). toString () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġclaims [" id "] Ġ= Ġjwt Id ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnew Claims Ġ= Ġgenerate Permissions ( id , Ġnew Claims , ĠGLOBAL _ AUTHORIZATION ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġjwt Ġ= Ġcreate Jwt ( id , Ġjwt Id , Ġnew Claims , Ġnow . time , Ġnot Before . time , Ġcalendar . time ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġcalendar . add ( Calendar . DAY _ OF _ MONTH , Ġrefresh Token Expiration In Days ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnew RefreshToken Ġ= ĠDigest Utils . sha 1 Hex ( id Ġ+ ĠUUID . randomUUID (). toString ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrefresh With Expire Key Ġ= Ġnew RefreshToken Ġ+ ĠREF RESH _ TOKEN _ SPLIT TER Ġ+ Ġcalendar . time . time ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġcreate Token Container ( id , Ġjwt Id , Ġemail , Ġnew RefreshToken , Ġnew Claims , Ġjwt , Ġrefresh With Expire Key , Ġresult Handler ) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠJwt Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . error (" Failed ĠToken ĠContainer ĠCreation !", Ġe ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġresult Handler . handle ( fail ( 5 0 0 , Ġ"" Ġ+ Ġe )) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠIllegalArgumentException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . error (" Failed ĠToken ĠContainer ĠCreation !", Ġe ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġresult Handler . handle ( fail ( 5 0 0 , Ġ"" Ġ+ Ġe )) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠNoSuch AlgorithmException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . error (" Failed ĠToken ĠContainer ĠCreation !", Ġe ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġresult Handler . handle ( fail ( 5 0 0 , Ġ"" Ġ+ Ġe )) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcreate Token Container ( ĊĠĠĠĠĠĠĠ Ġid : ĠString , ĊĠĠĠĠĠĠĠ Ġjwt Id : ĠString , ĊĠĠĠĠĠĠĠ Ġemail : ĠString , ĊĠĠĠĠĠĠĠ Ġnew RefreshToken : ĠString , ĊĠĠĠĠĠĠĠ Ġclaims : ĠMap < String , ĠAny >, ĊĠĠĠĠĠĠĠ Ġjwt : ĠString , ĊĠĠĠĠĠĠĠ Ġexpire Token : ĠString , ĊĠĠĠĠĠĠĠ Ġresult Handler : ĠHandler < AsyncResult < Token Container >> ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġmap Id Ġ= Ġid Ġ+ ĠVALID _ JWT _ REGISTRY _ KEY ĊĊĠĠĠĠĠĠĠ ĠRedis Utils . perform J edis With Retry ( redis Client ) Ġ{ Ġint Redis Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtransaction Ġ= Ġint Redis . transaction () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġtransaction . multi Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtransaction . h set ( map Id , Ġjwt Id , Ġexpire Token ) Ġ{ Ġresult Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult . failed () Ġ-> Ġlogger . error (" Could Ġnot Ġset Ġvalid Ġjwt Ġfor : Ġ$ email ", Ġresult . cause ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġencoded Claims Ġ= ĠJson . encode ( claims ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtransaction . set ( new RefreshToken , Ġencoded Claims ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( it . failed ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . error (" Could Ġnot Ġstore Ġref res ht o ken Ġfor : Ġ$ email ", Ġit . cause ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġtransaction . exec Ġ{ Ġexec Result Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexec Result . failed () Ġ-> Ġresult Handler . handle ( fail ( 5 0 0 , Ġ" Could Ġnot Ġset Ġvalid Ġjwt Ġfor : Ġ$ email ")) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġresult Handler . handle ( succeeded Future ( Token Container ( jwt , Ġnew RefreshToken ))) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Throws ( IllegalArgumentException :: class ) ĊĠĠĠ Ġprivate Ġfun Ġcreate Jwt ( ĊĠĠĠĠĠĠĠ Ġid : ĠString , ĊĠĠĠĠĠĠĠ Ġjwt Id : ĠString , ĊĠĠĠĠĠĠĠ Ġclaims : ĠMap < String , ĠAny >, ĊĠĠĠĠĠĠĠ Ġnow : ĠDate , ĊĠĠĠĠĠĠĠ Ġnot Before : ĠDate , ĊĠĠĠĠĠĠĠ Ġthen : ĠDate ĊĠĠĠ Ġ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠJ w ts . builder () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Claims ( claims ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Issuer ( IS SU ER ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Subject ( id ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Audience ( AU DI ENCE ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Expiration ( then ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Not Before ( not Before ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Iss ued At ( now ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. setId ( jwt Id ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. sign With ( Signature Algorithm . HS 5 1 2 , ĠSIGN ING _ KEY ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. compress With ( DE FL ATE ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. compact () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Throws ( IllegalArgumentException :: class ) ĊĠĠĠ Ġprivate Ġfun Ġcreate Jwt ( ĊĠĠĠĠĠĠĠ Ġid : ĠString , ĊĠĠĠĠĠĠĠ Ġjwt Id : ĠString , ĊĠĠĠĠĠĠĠ Ġclaims : ĠJ ws < Claims >, ĊĠĠĠĠĠĠĠ Ġnow : ĠDate , ĊĠĠĠĠĠĠĠ Ġnot Before : ĠDate , ĊĠĠĠĠĠĠĠ Ġthen : ĠDate ĊĠĠĠ Ġ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠJ w ts . builder () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Claims ( claims . body ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Issuer ( IS SU ER ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Subject ( id ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Audience ( AU DI ENCE ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Expiration ( then ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Not Before ( not Before ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Iss ued At ( now ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. setId ( jwt Id ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. sign With ( Signature Algorithm . HS 5 1 2 , ĠSIGN ING _ KEY ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. compress With ( DE FL ATE ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. compact () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġgenerate Permissions ( ĊĠĠĠĠĠĠĠ ĠuserId : ĠString , ĊĠĠĠĠĠĠĠ Ġclaims : ĠMutable Map < String , ĠAny >, ĊĠĠĠĠĠĠĠ Ġauth Origin : ĠString ĊĠĠĠ Ġ): ĠMutable Map < String , ĠAny > Ġ{ ĊĠĠĠĠĠĠĠ Ġclaims . put If Absent ( domain Identifier , ĠuserId ) ĊĊĠĠĠĠĠĠĠ Ġreturn Ġset Permission On Claims . apply ( Permission Pack ( userId , Ġclaims , Ġauth Origin )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Fluent ĊĠĠĠ Ġoverride Ġfun Ġrefresh ( ĊĠĠĠĠĠĠĠ Ġrefresh Token : ĠString , ĊĠĠĠĠĠĠĠ Ġresult Handler : ĠHandler < AsyncResult < Token Container >> ĊĠĠĠ Ġ): ĠAuthentication Service Ġ{ ĊĠĠĠĠĠĠĠ ĠgetToken Cache ( refresh Token ). compose ({ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġget Claims ( it ). compose ({ Ġmap Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġold Id Ġ= Ġmap [" id "]. toString () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠgetToken Container ( map ). compose ({ Ġtoken Container Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdelete Old ( map , Ġrefresh Token , Ġold Id , Ġtoken Container ). compose ({ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontainer Ġ-> Ġresult Handler . handle ( succeeded Future ( container )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}, Ġauth Fail < Any , ĠToken Container >( result Handler )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}, Ġauth Fail < Any , ĠToken Container >( result Handler )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}, Ġauth Fail < Any , ĠToken Container >( result Handler )) ĊĠĠĠĠĠĠĠ Ġ}, Ġauth Fail < Any , ĠToken Container >( result Handler )) ĊĊĠĠĠĠĠĠĠ Ġreturn Ġthis ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġdelete Old ( ĊĠĠĠĠĠĠĠ Ġclaims : ĠMutable Map < String , ĠAny >, ĊĠĠĠĠĠĠĠ Ġrefresh Token : ĠString , ĊĠĠĠĠĠĠĠ Ġold Id : ĠString , ĊĠĠĠĠĠĠĠ Ġtoken Container : ĠToken Container ĊĠĠĠ Ġ): ĠFuture < Token Container > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġtoken Container Future Ġ= Ġfuture < Token Container >() ĊĠĠĠĠĠĠĠ Ġval Ġemail Ġ= Ġclaims [ JWT _ CL AIM S _ USER _ EMAIL ]. toString () ĊĠĠĠĠĠĠĠ Ġval ĠuserId Ġ= Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠModel Utils . hash String ( email Ġ+ ĠE MAIL _ HASH _ KEY _ BASE ) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠNoSuch AlgorithmException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . error (" No ĠAlgorithm !", Ġe ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġemail ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġlogger . debug (" Pur ging : Ġ$ userId $ VALID _ JWT _ REGISTRY _ KEY Ġ$ old Id ") ĊĊĠĠĠĠĠĠĠ Ġval Ġregistry Ġ= ĠuserId Ġ+ ĠVALID _ JWT _ REGISTRY _ KEY ĊĊĠĠĠĠĠĠĠ ĠRedis Utils . perform J edis With Retry ( redis Client ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtransaction Ġ= Ġit . transaction () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġtransaction . multi Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtransaction . del ( refresh Token ) Ġ{ Ġresult Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( result . failed ()) Ġ{ Ġlogger . debug (" Del ĠRefresh Token Ġfailed !") Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtransaction . h del ( registry , Ġold Id ) Ġ{ Ġresult Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( result . failed ()) Ġ{ Ġlogger . debug (" Del ĠJwt Validity Ġfailed !") Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġtransaction . exec Ġ{ Ġresult Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult . failed () Ġ-> Ġtoken Container Future . fail ( Internal Error (" Unable Ġto Ġpurge Ġold Ġrefresh ... ")) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . debug (" Pur ged Ġall Ġrem n ants Ġof Ġold Ġrefresh ...") ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtoken Container Future . complete ( token Container ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġtoken Container Future ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget Claims ( token Cache : ĠString ?): ĠFuture < Mutable Map < String , ĠAny >> Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġclaims Future Ġ= Ġfuture < Mutable Map < String , ĠAny >>() ĊĊĠĠĠĠĠĠĠ Ġwhen Ġ( token Cache ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnull Ġ-> Ġclaims Future . fail ( ServiceException ( 5 0 0 , Ġ" Token Cache Ġcannot Ġbe Ġnull ... ")) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġclaims Ġ= ĠJson . decode Value ( token Cache , ĠMap :: class . java ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ@ Suppress (" UN CHECK ED _ CAST ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġclaims Future . complete ( claims Ġas ĠMutable Map < String , ĠAny > ?) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠDecode Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġclaims Future . fail ( e ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġclaims Future ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠgetToken Container ( claims : ĠMutable Map < String , ĠAny >): ĠFuture < Token Container > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġtoken Container Future Ġ= Ġfuture < Token Container >() ĊĠĠĠĠĠĠĠ Ġval Ġemail Ġ= Ġclaims [ JWT _ CL AIM S _ USER _ EMAIL ]. toString () ĊĊĠĠĠĠĠĠĠ Ġcreate Token Container ( email , Ġclaims , ĠHandler Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . failed () Ġ-> Ġtoken Container Future . fail ( it . cause ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġtoken Container Future . complete ( it . result ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}) ĊĊĠĠĠĠĠĠĠ Ġreturn Ġtoken Container Future ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠgetToken Cache ( refresh Token : ĠString ): ĠFuture < String > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġtoken Cache Future Ġ= Ġfuture < String >() ĊĊĠĠĠĠĠĠĠ ĠRedis Utils . perform J edis With Retry ( redis Client ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . get ( refresh Token ) Ġ{ Ġget Result Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġget Result . failed () Ġ-> Ġtoken Cache Future . fail ( getResult . cause ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġtoken Cache Future . complete ( getResult . result ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġtoken Cache Future ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Fluent ĊĠĠĠ Ġoverride Ġfun Ġswitch To Associated Domain ( ĊĠĠĠĠĠĠĠ Ġdomain Id : ĠString , ĊĠĠĠĠĠĠĠ Ġverify Result : ĠJ ws < Claims >, ĊĠĠĠĠĠĠĠ Ġresult Handler : ĠHandler < AsyncResult < Token Container >> ĊĠĠĠ Ġ): ĠAuthentication Service Ġ{ ĊĠĠĠĠĠĠĠ Ġverify Result . body [ domain Identifier ] Ġ= Ġdomain Id ĊĊĠĠĠĠĠĠĠ Ġcreate Token Container ( verify Result , Ġresult Handler ) ĊĊĠĠĠĠĠĠĠ Ġreturn Ġthis ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcreate Token Container ( claims : ĠJ ws < Claims >, Ġresult Handler : ĠHandler < AsyncResult < Token Container >>) Ġ{ ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġemail Ġ= Ġclaims . body [ JWT _ CL AIM S _ USER _ EMAIL ]. toString () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġid Ġ= ĠModel Utils . hash String ( email Ġ+ ĠE MAIL _ HASH _ KEY _ BASE ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnow Ġ= ĠCalendar . getInstance () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcalendar Ġ= ĠCalendar . getInstance () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcalendar . add ( Calendar . DAY _ OF _ MONTH , Ġid Token Expiration In Days ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnot Before Ġ= ĠCalendar . getInstance () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnot Before . add ( Calendar . MINUTE , Ġnot Before TimeIn Minutes ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġjwt Id Ġ= ĠUUID . randomUUID (). toString () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġclaims . body [" id "] Ġ= Ġjwt Id ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġjwt Ġ= Ġcreate Jwt ( id , Ġjwt Id , Ġclaims , Ġnow . time , Ġnot Before . time , Ġcalendar . time ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġcalendar . add ( Calendar . DAY _ OF _ MONTH , Ġrefresh Token Expiration In Days ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnew RefreshToken Ġ= ĠDigest Utils . sha 1 Hex ( id Ġ+ ĠUUID . randomUUID (). toString ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrefresh Token With Expire Key Ġ= Ġnew RefreshToken Ġ+ ĠREF RESH _ TOKEN _ SPLIT TER Ġ+ Ġcalendar . time . time ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmapped Claims Ġ= Ġclaims . body . entries . stream () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map < Simple Entry < String , ĠAny >> Ġ{ Ġe Ġ-> ĠSimple Entry ( e . key , Ġe . value ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. collect ( to Concurrent Map < Simple Entry < String , ĠAny >, ĠString , ĠAny >({ Ġit . key Ġ}) Ġ{ Ġit . value Ġ}) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġcreate Token Container ( id , Ġjwt Id , Ġemail , Ġnew RefreshToken , Ġmapped Claims , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġjwt , Ġrefresh Token With Expire Key , Ġresult Handler ) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠJwt Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . error (" Failed ĠToken ĠContainer ĠCreation !", Ġe ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġresult Handler . handle ( fail ( 5 0 0 , Ġ"" Ġ+ Ġe )) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠIllegalArgumentException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . error (" Failed ĠToken ĠContainer ĠCreation !", Ġe ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġresult Handler . handle ( fail ( 5 0 0 , Ġ"" Ġ+ Ġe )) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠNoSuch AlgorithmException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . error (" Failed ĠToken ĠContainer ĠCreation !", Ġe ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġresult Handler . handle ( fail ( 5 0 0 , Ġ"" Ġ+ Ġe )) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġclose () Ġ{ ĊĠĠĠĠĠĠĠ Ġredis Client . close Ġ{ Ġlogger . debug (" Redis Client Ġclosed Ġfor ĠAuthentication Service : Ġ" Ġ+ Ġit . succeeded ()) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġlogger Ġ= ĠLoggerFactory . getLogger ( Authentication ServiceImpl :: class . java . simple Name ) ĊĊĠĠĠĠĠĠĠ Ġprivate Ġvar ĠKEY _ ALGORITHM Ġ= Ġ" H mac SHA 5 1 2 " ĊĊĠĠĠĠĠĠĠ Ġconst Ġval ĠGOOGLE Ġ= Ġ" GOOGLE " ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠFACE BOOK Ġ= Ġ" FACE BOOK " ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠINST AG RAM Ġ= Ġ" INST AG RAM " ĊĊĠĠĠĠĠĠĠ Ġinternal Ġconst Ġval ĠREF RESH _ TOKEN _ SPLIT TER Ġ= Ġ" ____ " ĊĠĠĠ Ġ} Ċ } Ċ