package Ġcom . thought works . in spac . sdk . utility Ċ Ċ import Ġcom . nim bus ds . j ose . J WE Object Ċ import Ġcom . nim bus ds . j ose . crypto . RSA Decrypt er Ċ import Ġcom . nim bus ds . j ose . crypto . RS ASS A Verifier Ċ import Ġcom . nim bus ds . j ose . j wk . J WK Ċ import Ġcom . nim bus ds . jwt . JWT Claims Set Ċ import Ġcom . nim bus ds . jwt . Signed JWT Ċ import Ġcom . thought works . in spac . sdk . exception . Invalid JWT Claim Exception Ċ import Ġcom . thought works . in spac . sdk . model . Parse Token Params Ċ import Ġcom . thought works . in spac . sdk . model . Parsed Subject Info Ċ import Ġjava . time . Instant Ċ Ċ /** ĠA Ġutility Ġclass Ġfor Ġparsing Ġtoken . Ġ*/ Ċ object ĠParser Utils Ġ{ ĊĊĠĠĠ Ġprivate Ġconst Ġval ĠISS U ED _ AT _ CL AIM Ġ= Ġ" iat " ĊĠĠĠ Ġprivate Ġconst Ġval ĠEX PI RATION _ TIME _ CL AIM Ġ= Ġ" exp " ĊĠĠĠ Ġprivate Ġconst Ġval ĠNON CE _ CL AIM Ġ= Ġ" nonce " ĊĠĠĠ Ġprivate Ġconst Ġval ĠSUB JECT _ NR IC _ PREFIX Ġ= Ġ" s =" ĊĠĠĠ Ġprivate Ġconst Ġval ĠSUB JECT _ UUID _ PREFIX Ġ= Ġ" u =" ĊĠĠĠ Ġprivate Ġconst Ġval ĠCOM MA Ġ= Ġ"," ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThe Ġfunction Ġis Ġused Ġto Ġdecrypt ĠJ WE Ġto ĠSigned JWT ĊĠĠĠĠ Ġ* Ġ@ param Ġid Token Ġparameter Ġfor Ġid Token Ġfrom Ġtoken Ġresponse ĊĠĠĠĠ Ġ* Ġ@ param ĠprivateKey Pem Ġparameter Ġfor Ġservice Ġprivate Ġkey Ġto Ġdecrypt ĠJ WE ĊĠĠĠĠ Ġ* Ġ@ return ĠSigned JWT Ġthat Ġa Ġsigned ĠJSON ĠWeb ĠToken Ġ( JWT ) Ġrepresentation Ġof Ġthis Ġpayload ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ// Ġnot Ġsupport ĠPKCS # 1 Ġprivate Ġkey Ġdecrypt Ġyet ĊĠĠĠ Ġinternal Ġfun Ġdecrypt J WE ( id Token : ĠString , ĠprivateKey Pem : ĠString ): ĠSigned JWT Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġj we Object Ġ= ĠJ WE Object . parse ( id Token ) ĊĠĠĠĠĠĠĠ Ġval Ġj wk Ġ= ĠJ WK . parseFrom PEM Encoded Objects ( privateKey Pem ) ĊĠĠĠĠĠĠĠ Ġj we Object . decrypt ( RSA Decrypt er ( j wk . to RSA Key ())) ĊĊĠĠĠĠĠĠĠ Ġreturn Ġj we Object . payload . to Signed JWT () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThe Ġfunction Ġis Ġused Ġto Ġverify Ġthe Ġsignature Ġof Ġthis ĠJ WS Ġobject Ġwith Ġthe Ġspecified Ġverifier ĊĠĠĠĠ Ġ* Ġ@ param Ġsigned JWT Ġparameter Ġfor Ġa Ġsigned ĠJSON ĠWeb ĠToken Ġ( JWT ) Ġrepresentation Ġof Ġthis Ġpayload ĊĠĠĠĠ Ġ* Ġ@ param Ġkey Ġparameter Ġfor ĠID P Ġpublic Ġkey Ġto Ġverify Ġsignature ĊĠĠĠĠ Ġ* Ġ@ return Ġ{@ code Ġtrue } Ġif Ġthe Ġsignature Ġwas Ġsuccessfully Ġverified , ĊĠĠĠĠ Ġ* ĠĠĠĠĠĠĠĠ Ġelse Ġ{@ code Ġfalse } ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġinternal Ġfun Ġverify J WS ( signed JWT : ĠSigned JWT , Ġkey : ĠString ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġj wk Ġ= ĠJ WK . parseFrom PEM Encoded Objects ( key ) ĊĊĠĠĠĠĠĠĠ Ġreturn Ġsigned JWT . verify ( RS ASS A Verifier ( j wk . to RSA Key ())) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThe Ġfunction Ġis Ġused Ġto Ġverify Ġpayload Ġof ĠJ WS Ġobject ĊĠĠĠĠ Ġ* Ġ@ param Ġsigned JWT Ġparameter Ġfor Ġa Ġsigned ĠJSON ĠWeb ĠToken Ġ( JWT ) Ġrepresentation Ġof Ġthis Ġpayload ĊĠĠĠĠ Ġ* Ġ@ param Ġparse Token Params Ġparameter Ġfor Ġverify ing ĊĠĠĠĠ Ġ* Ġ@ throws ĠInvalid JWT Claim Exception Ġif Ġthe Ġpayload Ġwas Ġun successful Ġverified ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ// ĠMock pass Ġnot Ġimplement Ġrefresh Ġtoken Ġyet , Ġ` rt _ hash ` Ġdepends Ġon Ġit , Ġand Ġunknown Ġthe Ġhash Ġalgorithm ĊĠĠĠ Ġ// ĠMock pass Ġnot Ġimplement Ġaccess Ġtoken Ġyet , Ġ` at _ hash ` Ġdepends Ġon Ġit , Ġand Ġunknown Ġthe Ġhash Ġalgorithm ĊĠĠĠ Ġinternal Ġfun Ġverify JWT Claims ( signed JWT : ĠSigned JWT , Ġparse Token Params : ĠParse Token Params ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġjwt Claims Set Ġ= Ġsigned JWT . jwt Claims Set ĊĊĠĠĠĠĠĠĠ Ġverify Nonce ( jwt Claims Set , Ġparse Token Params ) ĊĠĠĠĠĠĠĠ Ġverify Iss ued And Expiration Time ( signed JWT ) ĊĠĠĠĠĠĠĠ Ġverify Issuer ( jwt Claims Set , Ġparse Token Params ) ĊĠĠĠĠĠĠĠ Ġverify Audience ( jwt Claims Set , Ġparse Token Params ) ĊĠĠĠĠĠĠĠ Ġverify Subject ( jwt Claims Set ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThe Ġfunction Ġis Ġused Ġto Ġextract Ġn ric Number Ġand Ġuuid Ġfrom Ġsub Ġof Ġpayload ĊĠĠĠĠ Ġ* Ġ@ param Ġsigned JWT Ġparameter Ġfor Ġa Ġsigned ĠJSON ĠWeb ĠToken Ġ( JWT ) Ġrepresentation Ġof Ġthis Ġpayload ĊĠĠĠĠ Ġ* Ġ@ return ĠParsed Subject Info Ġwith Ġn ric Number Ġand Ġuuid ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġinternal Ġfun Ġextract Subject ( signed JWT : ĠSigned JWT ): ĠParsed Subject Info Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġsubject Infos Ġ= Ġsigned JWT . jwt Claims Set . subject . split ( COMMA ) ĊĠĠĠĠĠĠĠ Ġval Ġn ric Number Ġ= Ġsubject Infos . find Ġ{ Ġit . startsWith ( SUBJECT _ NR IC _ PREFIX ) Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġuuid Ġ= Ġsubject Infos . find Ġ{ Ġit . startsWith ( SUBJECT _ UUID _ PREFIX ) Ġ}. or Empty () ĊĊĠĠĠĠĠĠĠ Ġreturn ĠParsed Subject Info ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġn ric Number ?. substring ( SUBJECT _ NR IC _ PREFIX . length ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġuuid . substring ( SUBJECT _ UUID _ PREFIX . length ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThe Ġfunction Ġis Ġused Ġto Ġextract Ġcorresponding Ġvalue Ġby Ġthe Ġkey Ġof Ġclaims Ġfrom Ġpayload ĊĠĠĠĠ Ġ* Ġ@ param Ġsigned JWT Ġparameter Ġfor Ġa Ġsigned ĠJSON ĠWeb ĠToken Ġ( JWT ) Ġrepresentation Ġof Ġthis Ġpayload ĊĠĠĠĠ Ġ* Ġ@ param Ġkey Ġparameter Ġfor Ġthe Ġkey Ġof Ġclaims Ġto Ġget ĠJsonObject ĊĠĠĠĠ Ġ* Ġ@ return ĠThe Ġvalue Ġof Ġa Ġkey Ġof Ġpayload , Ġ{@ code Ġnull } Ġif Ġnot Ġfound . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġinternal Ġfun Ġextract ( signed JWT : ĠSigned JWT , Ġkey : ĠString ) Ġ= Ġsigned JWT . jwt Claims Set . getJSONObject Claim ( key ) ĊĊĠĠĠ Ġprivate Ġfun Ġverify Subject ( jwt Claims Set : ĠJWT Claims Set ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġsub Ġ= Ġjwt Claims Set . subject Ġ?: Ġthrow ĠInvalid JWT Claim Exception (" Sub Ġis Ġmissing ") ĊĠĠĠĠĠĠĠ Ġif Ġ(! sub . contains ( SUBJECT _ UUID _ PREFIX )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠInvalid JWT Claim Exception (" S ud Ġshould Ġcontain Ġuuid Ġat Ġleast ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġverify Audience ( jwt Claims Set : ĠJWT Claims Set , Ġparse Token Params : ĠParse Token Params ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( jwt Claims Set . audience . none Ġ{ Ġit Ġ== Ġparse Token Params . clientId Ġ}) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠInvalid JWT Claim Exception (" Aud Ġis Ġnot Ġequal Ġto Ġclient Ġid ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġverify Issuer ( jwt Claims Set : ĠJWT Claims Set , Ġparse Token Params : ĠParse Token Params ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġiss Ġ= Ġjwt Claims Set . issuer Ġ?: Ġthrow ĠInvalid JWT Claim Exception (" Iss Ġis Ġmissing ") ĊĠĠĠĠĠĠĠ Ġif Ġ( iss Ġ!= Ġparse Token Params . host ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠInvalid JWT Claim Exception (" Iss Ġis Ġnot Ġequal Ġto Ġid p Ġhost ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġverify Iss ued And Expiration Time ( signed JWT : ĠSigned JWT ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġi at Ġ= Ġget Number Claim From JWT ( signed JWT , ĠISS U ED _ AT _ CL AIM ) ĊĠĠĠĠĠĠĠ Ġval Ġexp Ġ= Ġget Number Claim From JWT ( signed JWT , ĠEX PI RATION _ TIME _ CL AIM ) ĊĠĠĠĠĠĠĠ Ġval Ġnow Ġ= ĠInstant . now () ĊĠĠĠĠĠĠĠ Ġif Ġ( iat . to Long () Ġ> Ġnow . epoch Second ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠInvalid JWT Claim Exception (" I at Ġshould Ġbefore Ġnow ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( exp . to Long () Ġ< Ġnow . epoch Second ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠInvalid JWT Claim Exception (" Exp Ġis Ġexpired ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget Number Claim From JWT ( signed JWT : ĠSigned JWT , Ġclaim : ĠString ): ĠNumber Ġ= ĊĠĠĠĠĠĠĠ Ġsigned JWT . payload . to JSONObject (). getAs Number ( claim ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġthrow ĠInvalid JWT Claim Exception ("${ claim . capitalize ()} Ġis Ġmissing ") ĊĊĠĠĠ Ġprivate Ġfun Ġverify Nonce ( jwt Claims Set : ĠJWT Claims Set , Ġparse Token Params : ĠParse Token Params ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġnonce Ġ= Ġjwt Claims Set . getString Claim ( NON CE _ CL AIM ) Ġ?: Ġthrow ĠInvalid JWT Claim Exception (" Nonce Ġis Ġmissing ") ĊĠĠĠĠĠĠĠ Ġif Ġ( nonce Ġ!= Ġparse Token Params . nonce ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠInvalid JWT Claim Exception (" Nonce Ġis Ġnot Ġequal Ġto Ġthe Ġnonce Ġin Ġinit Ġauth Ġrequest ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ