package Ġio . github . sh y amz . openid connect . validation Ċ Ċ import Ġcom . nim bus ds . j ose . J WS Header Ċ import Ġcom . nim bus ds . jwt . JWT Claims Set Ċ import Ġcom . nim bus ds . jwt . Signed JWT Ċ import Ġcom . nim bus ds . jwt . util . Date Utils Ċ import Ġio . github . sh y amz . openid connect . Standard Claims . address Ċ import Ġio . github . sh y amz . openid connect . Standard Claims . birth date Ċ import Ġio . github . sh y amz . openid connect . Standard Claims . country Ċ import Ġio . github . sh y amz . openid connect . Standard Claims . email Ċ import Ġio . github . sh y amz . openid connect . Standard Claims . email _ verified Ċ import Ġio . github . sh y amz . openid connect . Standard Claims . family _ name Ċ import Ġio . github . sh y amz . openid connect . Standard Claims . formatted Ċ import Ġio . github . sh y amz . openid connect . Standard Claims . gender Ċ import Ġio . github . sh y amz . openid connect . Standard Claims . given _ name Ċ import Ġio . github . sh y amz . openid connect . Standard Claims . locale Ċ import Ġio . github . sh y amz . openid connect . Standard Claims . locality Ċ import Ġio . github . sh y amz . openid connect . Standard Claims . middle _ name Ċ import Ġio . github . sh y amz . openid connect . Standard Claims . name Ċ import Ġio . github . sh y amz . openid connect . Standard Claims . nickname Ċ import Ġio . github . sh y amz . openid connect . Standard Claims . phone _ number Ċ import Ġio . github . sh y amz . openid connect . Standard Claims . phone _ number _ verified Ċ import Ġio . github . sh y amz . openid connect . Standard Claims . picture Ċ import Ġio . github . sh y amz . openid connect . Standard Claims . postal _ code Ċ import Ġio . github . sh y amz . openid connect . Standard Claims . preferred _ username Ċ import Ġio . github . sh y amz . openid connect . Standard Claims . profile Ċ import Ġio . github . sh y amz . openid connect . Standard Claims . region Ċ import Ġio . github . sh y amz . openid connect . Standard Claims . street _ address Ċ import Ġio . github . sh y amz . openid connect . Standard Claims . updated _ at Ċ import Ġio . github . sh y amz . openid connect . Standard Claims . website Ċ import Ġio . github . sh y amz . openid connect . Standard Claims . zone info Ċ import Ġio . github . sh y amz . openid connect . configuration . Client Configuration Ċ import Ġio . github . sh y amz . openid connect . configuration . model . Algorithm Type Ċ import Ġio . github . sh y amz . openid connect . exceptions . Open Id Connect Exception Ċ import Ġio . github . sh y amz . openid connect . response . model .* Ċ import Ġjava . time . Duration Ċ import Ġjava . time . Instant Ċ import Ġjava . util .* Ċ Ċ internal Ġfun ĠJ WS Header . signing Algorithm (): ĠAlgorithm Type Ġ{ ĊĠĠĠ Ġreturn ĠClient Configuration . provider . id Token Signing Algorithms . first OrNull Ġ{ ĊĠĠĠĠĠĠĠ Ġit . name Ġ== Ġalgorithm . name ĊĠĠĠ Ġ} ?. algorithm Type () Ġ?: Ġthrow ĠOpen Id Connect Exception (" M alic ious ĠToken . ĠId P Ġdoes Ġnot Ġsupport ĠAlgorithm Ġ'$ algorithm '") Ċ } Ċ Ċ internal Ġfun ĠJWT Claims Set . validate Time Elapsed Since Last Authentication (): ĠJWT Claims Set Ġ{ ĊĊĠĠĠ Ġget Date Claim (" auth _ time ") ?. let Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġelapsed Time Since Last Authenticated Ġ= ĠDuration . between ( Instant . of Epoch Milli ( it . time ), ĠInstant . now ()) ĊĠĠĠĠĠĠĠ Ġif Ġ( elapsed Time Since Last Authenticated . abs (). seconds Ġ> ĠClient Configuration . max Age Since User Authenticated ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠOpen Id Connect Exception (" User Ġlast Ġauthenticated Ġwas Ġ'${ elapsed Time Since Last Authenticated . abs (). to Minutes () }' Ġminutes Ġbefore . ĠRe Ġauthenticate Ġthe Ġuser ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġreturn Ġthis Ċ } Ċ Ċ internal Ġfun ĠJWT Claims Set . validate Nonce ( nonce : ĠString ? Ġ= Ġnull ): ĠJWT Claims Set Ġ{ ĊĠĠĠ Ġif Ġ( getString Claim (" nonce ") Ġ!= Ġnonce ) Ġ{ ĊĠĠĠĠĠĠĠ Ġthrow ĠOpen Id Connect Exception (" Expected Ġnonce Ġ'${ getString Claim (" nonce ") }' Ġin Ġid _ token Ġto Ġmatch Ġstored Ġnonce Ġ'$ nonce '") ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġthis Ċ } Ċ Ċ internal Ġfun ĠJWT Claims Set . validate Iss ued At (): ĠJWT Claims Set Ġ{ ĊĠĠĠ Ġval Ġissued Duration Ġ= ĠDuration . between ( Instant . now (), ĠInstant . of Epoch Milli ( issue Time . time )) ĊĠĠĠ Ġif Ġ( iss ued Duration . abs (). seconds Ġ> ĠClient Configuration . clock Sk ew Seconds ) Ġ{ ĊĠĠĠĠĠĠĠ Ġthrow ĠOpen Id Connect Exception (" id _ token Ġis Ġissued Ġat Ġ'$ issue Time ' Ġis Ġtoo Ġfar Ġaway Ġfrom Ġthe Ġcurrent Ġtime Ġ'${ Date () }' ") ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġthis Ċ } Ċ Ċ internal Ġfun ĠJWT Claims Set . validate Token Expiry (): ĠJWT Claims Set Ġ{ ĊĠĠĠ Ġif Ġ( Date Utils . is After ( Date (), Ġexpiration Time , ĠClient Configuration . clock Sk ew Seconds )) Ġ{ ĊĠĠĠĠĠĠĠ Ġthrow ĠOpen Id Connect Exception (" id _ token Ġexpired . ĠToken Ġexpiration Ġtime Ġis Ġ'$ expiration Time '") ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġthis Ċ } Ċ Ċ internal Ġfun ĠJWT Claims Set . validate Authorized Party (): ĠJWT Claims Set Ġ{ ĊĠĠĠ Ġif Ġ( getString Claim (" az p "). isNull Or Blank (). not () Ġ&& ĠgetString Claim (" az p ") Ġ!= ĠClient Configuration . client . id ) Ġ{ ĊĠĠĠĠĠĠĠ Ġthrow ĠOpen Id Connect Exception (" Expected Ġaz p Ġ'${ getString Claim (" az p ") }' Ġin Ġid _ token Ġto Ġmatch Ġclient Ġid Ġ'${ Client Configuration . client . id }' ") ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġthis Ċ } Ċ Ċ internal Ġfun ĠJWT Claims Set . validate Audience Has Authorized Party (): ĠJWT Claims Set Ġ{ ĊĠĠĠ Ġif Ġ( audience . size Ġ> Ġ 1 Ġ&& ĠgetString Claim (" az p "). isNull Or Blank ()) Ġ{ ĊĠĠĠĠĠĠĠ Ġthrow ĠOpen Id Connect Exception (" Expected Ġid _ token Ġwith Ġmultiple Ġaud i ences Ġ'$ audience ' Ġto Ġhave Ġan Ġ' az p ' Ġclaim . ĠBut Ġfound Ġnone ") ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġthis Ċ } Ċ Ċ internal Ġfun ĠJWT Claims Set . validate Audience (): ĠJWT Claims Set Ġ{ ĊĠĠĠ Ġif Ġ( audience . contains ( Client Configuration . client . id ). not ()) Ġ{ ĊĠĠĠĠĠĠĠ Ġthrow ĠOpen Id Connect Exception (" Expected Ġaudience Ġ'$ audience ' Ġin Ġid _ token Ġto Ġcontain Ġclient Ġ'${ Client Configuration . client . id }' ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġreturn Ġthis Ċ } Ċ Ċ internal Ġfun ĠJWT Claims Set . validate Issuer (): ĠJWT Claims Set Ġ{ ĊĠĠĠ Ġif Ġ( issuer Ġ!= ĠClient Configuration . provider . issuer . toString ()) Ġ{ ĊĠĠĠĠĠĠĠ Ġthrow ĠOpen Id Connect Exception (" Expected Ġissuer Ġ'$ issuer ' Ġin Ġid _ token Ġto Ġmatch Ġwell Ġknown Ġconfig Ġissuer Ġ'${ Client Configuration . provider . issuer }' ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġreturn Ġthis Ċ } Ċ Ċ internal Ġfun ĠSigned JWT . verify Signature (): ĠJWT Claims Set Ġ{ ĊĠĠĠ Ġif Ġ(! verify ( Signature Verifier Factory . j ws Verifier ( this . header ))) Ġ{ ĊĠĠĠĠĠĠĠ Ġthrow ĠOpen Id Connect Exception (" M alic ious ĠToken . Ġsignature Ġverification Ġfailed Ġfor Ġtoken : Ġ\ n ' ${ this . serialize () }' ") ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġthis . jwt Claims Set Ċ } Ċ Ċ internal Ġfun ĠJWT Claims Set . client Info (): ĠClient Info Ġ{ ĊĠĠĠ Ġreturn Ġaudience ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. take If Ġ{ Ġit . size Ġ> Ġ 1 Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ? . let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠClient Info ( authorized Party (), Ġaudience . filter Not Ġ{ Ġit Ġ== Ġauthorized Party () Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġ?: ĠClient Info ( audience . first ()) Ċ } Ċ Ċ internal Ġfun ĠJWT Claims Set . authorized Party () Ġ= ĠgetString Claim (" az p ") Ċ Ċ internal Ġfun ĠJWT Claims Set . userInfo (): ĠUserInfo Ġ{ ĊĊĠĠĠ Ġval Ġprofile Ġ= ĠProfile ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠuserId Ġ= Ġsubject , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġname Ġ= ĠgetString Claim ( name ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġgiven Name Ġ= ĠgetString Claim ( given _ name ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfamily Name Ġ= ĠgetString Claim ( family _ name ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmiddle Name Ġ= ĠgetString Claim ( middle _ name ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnickname Ġ= ĠgetString Claim ( nickname ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpreferred Username Ġ= ĠgetString Claim ( preferred _ username ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprofile Ġ= ĠgetString Claim ( profile ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpicture Ġ= ĠgetString Claim ( picture ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwebsite Ġ= ĠgetString Claim ( website ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġgender Ġ= ĠgetString Claim ( gender ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbirth Date Ġ= ĠgetString Claim ( birth date ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlocale Ġ= ĠgetString Claim ( locale ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġzone Info Ġ= ĠgetString Claim ( zone info ), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠupdatedAt Ġ= Ġget Long Claim ( updated _ at ) ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġval Ġemail Ġ= ĠgetString Claim ( email ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ? . take Unless Ġ{ Ġit . isBlank () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ? . let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠEmail ( email Ġ= Ġit , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġemail Verified Ġ= Ġget Boolean Claim ( email _ verified )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġphone Ġ= ĠgetString Claim ( phone _ number ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ? . take Unless Ġ{ Ġit . isBlank () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ? . let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPhone Number ( phoneNumber Ġ= Ġit , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠphoneNumber Verified Ġ= Ġget Boolean Claim ( phone _ number _ verified )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġaddress Ġ= Ġget JSONObject Claim ( address ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ? . let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAddress ( formatted Ġ= Ġit . get AsString ( formatted ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstreet Address Ġ= Ġit . get AsString ( street _ address ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlocal ity Ġ= Ġit . get AsString ( locality ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġregion Ġ= Ġit . get AsString ( region ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpostal Code Ġ= Ġit . get AsString ( postal _ code ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcountry Ġ= Ġit . get AsString ( country ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĊĠĠĠ Ġreturn ĠUserInfo ( profile , Ġemail , Ġphone , Ġaddress ) Ċ } Ċ