package Ġio . github . se ven par adig ms . ab ac . security . support Ċ Ċ import Ġio . github . se ven par adig ms . ab ac . Constants Ċ import Ġio . github . se ven par adig ms . ab ac . Constants . AN ONY MO US Ċ import Ġio . github . se ven par adig ms . ab ac . Constants . AUTHOR IZE _ KEY Ċ import Ġio . github . se ven par adig ms . ab ac . Constants . AUTHOR IZE _ LOGIN Ċ import Ġio . github . se ven par adig ms . ab ac . Constants . AUTHOR IZE _ RO LES Ċ import Ġio . github . se ven par adig ms . ab ac . Constants . BE AR ER Ċ import Ġio . github . se ven par adig ms . ab ac . Constants . REFRESH _ TOKEN Ċ import Ġio . github . se ven par adig ms . ab ac . Constants . ROLE _ USER Ċ import Ġio . github . se ven par adig ms . ab ac . configuration . Jwt Properties Ċ import Ġio . github . se ven par adig ms . ab ac . get Bearer Token Ċ import Ġio . github . se ven par adig ms . ab ac . has Header Ċ import Ġio . github . se ven par adig ms . ab ac . security . auth . data . Auth Response Ċ import Ġio . github . se ven par adig ms . ab ac . security . auth . data . User Principal Ċ import Ġio . github . se ven par adig ms . ab ac . security . auth . data . to User Ċ import Ġio . github . se ven par adig ms . ab ac . security . auth . encrypt . Jwt Token Provider Ċ import Ġio . json web token . Claims Ċ import Ġorg . apache . commons . codec . digest . M urm ur Hash 2 Ċ import Ġorg . apache . commons . lang 3 . Object Utils Ċ import Ġorg . apache . commons . lang 3 . StringUtils Ċ import Ġorg . se ven par adig ms . kotlin . common . parse Json Ċ import Ġorg . springframework . data . r 2 dbc . support . Beans Ċ import Ġorg . springframework . data . r 2 dbc . support . Dsl Utils Ċ import Ġorg . springframework . data . r 2 dbc . support . Json Utils Ċ import Ġorg . springframework . http . HttpHeaders Ċ import Ġorg . springframework . http . HttpStatus Ċ import Ġorg . springframework . http . server . reactive . Server HttpRequest Ċ import Ġorg . springframework . security . authentication . Anonymous Authentication Token Ċ import Ġorg . springframework . security . authentication . Bad Credentials Exception Ċ import Ġorg . springframework . security . authentication . Reactive Authentication Manager Ċ import Ġorg . springframework . security . authentication . Username Password Authentication Token Ċ import Ġorg . springframework . security . config . web . server . Server Http Security Ċ import Ġorg . springframework . security . core . Authentication Ċ import Ġorg . springframework . security . core . Authentication Exception Ċ import Ġorg . springframework . security . core . Granted Authority Ċ import Ġorg . springframework . security . core . authority . Authority Utils Ċ import Ġorg . springframework . security . core . authority . Simple Granted Authority Ċ import Ġorg . springframework . security . core . user details . User Ċ import Ġorg . springframework . security . oauth 2 . server . resource . int rospection . Reactive Opaque Token Int ros pector Ċ import Ġorg . springframework . security . web . server . Server Authentication EntryPoint Ċ import Ġorg . springframework . security . web . server . authentication . Server Authentication Converter Ċ import Ġorg . springframework . security . web . server . util . matcher . Server Web Exchange Matcher Ċ import Ġorg . springframework . web . reactive . function . server . Server Request Ċ import Ġorg . springframework . web . reactive . function . server . Server Response Ċ import Ġorg . springframework . web . reactive . function . server . Server Response . ok Ċ import Ġorg . springframework . web . server . Server Web Exchange Ċ import Ġreactor . core . publisher . Mono Ċ import Ġreactor . kotlin . core . util . function . component 1 Ċ import Ġreactor . kotlin . core . util . function . component 2 Ċ import Ġreactor . kotlin . core . util . function . component 3 Ċ import Ġjava . util .* Ċ import Ġjava . util . concurrent . TimeUnit Ċ Ċ open Ġclass ĠConfig Helper Ġ{ ĊĠĠĠ Ġfun Ġun authorized EntryPoint () Ġ= ĊĠĠĠĠĠĠĠ ĠServer Authentication EntryPoint Ġ{ Ġexchange : ĠServer Web Exchange , Ġ_: ĠAuthentication Exception Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMono . from Runnable Ġ{ Ġexchange . response . statusCode Ġ= ĠHttpStatus . UN AUTHORIZ ED Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġtoken Authentication Converter ( is Authorize Key Enabled : ĠBoolean , Ġjwt Token Provider : ĠJwt Token Provider ) Ġ= ĊĠĠĠĠĠĠĠ ĠServer Authentication Converter Ġ{ Ġserver Web Exchange : ĠServer Web Exchange Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbe arer Token Ġ= Ġserver Web Exchange . request . headers . getFirst ( HttpHeaders . AUTHORIZATION ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( Object Utils . isEmpty ( bearer Token ) Ġ|| Ġ! bearer Token !!. startsWith ( BE AR ER ) Ġ|| Ġbe arer Token . length Ġ<= ĠBE AR ER . length ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( is Authorize Key Enabled ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠuserId Ġ= Ġserver Web Exchange . request . headers . getFirst ( AUTHOR IZE _ KEY ) Ġas ĠString ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlogin Ġ= Ġif Ġ( server Web Exchange . request . headers . containsKey ( AUTHOR IZE _ LOGIN )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġserver Web Exchange . request . headers . getFirst ( AUTHOR IZE _ LOGIN ) Ġas ĠString ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠStringUtils . EMPTY ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġroles Ġ= Ġserver Web Exchange . request . headers . getFirst ( AUTHOR IZE _ RO LES ) Ġas ĠString ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġauthor ities Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( Object Utils . isEmpty ( roles )) ĠAuthor ity Utils . create Authority List ( ROLE _ USER ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse ĠAuthor ity Utils . create Authority List (* roles . split ("," ). to Typed Array ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġprincipal Ġ= ĠUser ( userId , Ġlogin , Ġauthor ities ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ Server Authentication Converter ĠMono . just ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠUsername Password Authentication Token ( principal , ĠUUID . fromString ( userId ), Ġauthor ities ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ Server Authentication Converter ĠMono . just ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAn onymous Authentication Token ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" key ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" anonymous ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAuthor ity Utils . create Authority List ( AN ONY MO US ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( Beans . of ( Jwt Properties :: class . java ). skip Token Validation ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ Server Authentication Converter Ġskip Validation ( bearer Token . substring ( BE AR ER . length )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMono . just ( jwt Token Provider . get Authentication ( bearer Token . substring ( BE AR ER . length ))) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġjwt Headers Exchange Matcher ( is Authorize Key Enabled : ĠBoolean ) Ġ= ĊĠĠĠĠĠĠĠ ĠServer Web Exchange Matcher Ġ{ Ġserver Web Exchange : ĠServer Web Exchange Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMono . just ( server Web Exchange ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġobj : ĠServer Web Exchange Ġ-> Ġobj . request Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġobj : ĠServer HttpRequest Ġ-> Ġobj . headers Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . containsKey ( HttpHeaders . AUTHORIZATION ) Ġ|| Ġ( is Authorize Key Enabled Ġ&& Ġit . containsKey ( AUTHOR IZE _ KEY )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. flatMap Ġ{ ĠServer Web Exchange Matcher . Match Result . match () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. switch If Empty ( Server Web Exchange Matcher . Match Result . not Match ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġauthorize ( server Request : ĠServer Request ): ĠMono < Server Response > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġjwt Token Provider Ġ= ĠBe ans . of ( Jwt Token Provider :: class . java ) ĊĠĠĠĠĠĠĠ Ġval Ġauthentication Manager Ġ= ĠBe ans . of ( Reactive Authentication Manager :: class . java ) ĊĠĠĠĠĠĠĠ Ġval Ġexpiration Ġ= ĠBe ans . of ( Jwt Properties :: class . java ). expiration ĊĠĠĠĠĠĠĠ Ġreturn Ġserver Request . body To Mono ( User Principal :: class . java ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Ġ{ Ġ! Object Utils . isEmpty ( it . login ) Ġ&& Ġ! Object Utils . isEmpty ( it . password ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. switch If Empty ( Mono . error Ġ{ Ġthrow ĠBad Credentials Exception (" Login Ġand Ġpassword Ġrequired ") Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. flatMap Ġ{ Ġauthentication Manager . authenticate ( Username Password Authentication Token ( it . login , Ġit . password )) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġjwt Token Provider . get Authentication Token ( it ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. flatMap Ġ{ ĠaccessToken Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġok (). body Value ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAuth Response ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtoken Type Ġ= ĠBE AR ER . trim (). lowercase (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠaccessToken Ġ= ĠaccessToken , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexpires In Ġ= Ġexpiration , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrefresh Token Ġ= Ġjwt Token Provider . get RefreshToken ( accessToken ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġrefresh ( server Request : ĠServer Request ): ĠMono < Server Response > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġerror : ĠString ĊĠĠĠĠĠĠĠ Ġval Ġjwt Token Provider Ġ= ĠBe ans . of ( Jwt Token Provider :: class . java ) ĊĠĠĠĠĠĠĠ Ġval Ġrefresh Token Ġ= Ġserver Request . query Param ( REFRESH _ TOKEN ) ĊĠĠĠĠĠĠĠ Ġif Ġ( server Request . has Header ( HttpHeaders . AUTHORIZATION ) Ġ&& Ġrefresh Token . isPresent Ġ&& ĠObject Utils . isNotEmpty ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrefresh Token . get () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġ( hash , Ġexpire ) Ġ= ĠJwt Cache . get Refresh ( refresh Token . get ()) !! ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġauthorize Key Ġ= Ġserver Request . get Bearer Token () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( M urm ur Hash 2 . hash 6 4 ( authorize Key ) Ġ== Ġhash Ġ&& ĠDate (). before ( expire )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġ( principal , Ġ_, Ġexpired ) Ġ= ĠJwt Cache . get ( hash ) !! ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! expired ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġauthentication Ġ= Ġjwt Token Provider . get Authentication Token ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠUsername Password Authentication Token ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprincipal . to User (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprincipal . id , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprincipal . to User (). author ities ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġexpiration Ġ= ĠBe ans . of ( Jwt Properties :: class . java ). expiration ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠJwt Cache . revoke ( hash ). ev ict Refresh ( refresh Token . get ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġok (). body Value ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAuth Response ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtoken Type Ġ= ĠBE AR ER . trim (). lowercase (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠaccessToken Ġ= Ġauthentication , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexpires In Ġ= Ġexpiration , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrefresh Token Ġ= Ġjwt Token Provider . get RefreshToken ( authentication ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġerror Ġ= Ġ" Bearer Ġtoken Ġis Ġrev oked " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġerror Ġ= Ġ" Actual ĠBearer Ġtoken Ġis Ġnot Ġfound Ġor Ġrefresh Ġtoken Ġis Ġexpired " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġerror Ġ= Ġ" Authorization Ġheader Ġor Ġquery Ġparam Ġ` refresh _ token ` Ġis Ġnot Ġfound " ĊĠĠĠĠĠĠĠ Ġreturn ĠServer Response . bad Request (). body Value ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠJson Utils . object Node () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. put (" error ", Ġ" Invalid Ġrequest ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. put (" error ", Ġerror ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġskip Validation ( auth Token : ĠString ): ĠMono < Authentication > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġexpiration Property Ġ= ĠBe ans . of ( Jwt Properties :: class . java ). expiration ĊĠĠĠĠĠĠĠ Ġreturn ĠMono . just ( auth Token ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. handle Ġ{ Ġtoken , Ġsink Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġclaims Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠString ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠBase 6 4 . get Decoder (). decode ( token . split ( Dsl Utils . DOT )[ 1 ]) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ). parse Json ( Linked HashMap :: class . java ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(( claims [ Claims . EXPI RATION ] Ġas ĠInt ). plus ( expiration Property Ġ* Ġ 1 0 0 0 ) Ġ< ĠTimeUnit . MILLISECONDS . to Seconds ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSystem . currentTimeMillis () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġerror (" Expired ĠJWT Ġtoken ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġauthor ities : ĠCollection < Granted Authority > Ġ= Ġ( claims [ Constants . RO LES _ KEY ] Ġas ĠList < String >) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġrole Ġ-> ĠSimple Granted Authority ( role ) Ġ}. toList () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġprincipal Ġ= ĠUser ( claims [ Claims . SUBJECT ]. toString (), ĠStringUtils . EMPTY , Ġauthor ities ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠuserId Ġ= ĠUUID . fromString ( claims [ Constants . USER _ ID ] Ġas ĠString ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsink . next ( Username Password Authentication Token ( principal , ĠuserId , Ġauthor ities )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġtry Add Token Int rospect ( http : ĠServer Http Security ): ĠServer Http Security Ġ{ ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġint rospect Ġ= ĠBe ans . of ( Reactive Opaque Token Int ros pector :: class . java ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhttp . oauth 2 Resource Server (). opaque Token (). int ros pector ( int rospect ) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ(_ : ĠRuntimeException ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġhttp ĊĠĠĠ Ġ} Ċ }