package Ġid . walt . web wallet . backend . oidc Ċ Ċ import Ġid . walt . web wallet . backend . oidc . requests .* Ċ import Ġid . walt . web wallet . backend . oidc . responses . Oid c Consent Response Ċ import Ġid . walt . web wallet . backend . oidc . responses . Oid c Token Response Ċ import Ġid . walt . web wallet . backend . oidc . responses . Oid c UserInfo Response Ċ import Ġorg . slf 4 j . LoggerFactory ĊĊ Ċ object ĠO id c Service Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġlog Ġ= ĠLoggerFactory . getLogger ( Oid c Service :: class . java ) ĊĊĠĠĠ Ġ// fun Ġinsert Client ( client : ĠO id c Client ) Ġ= ĠDatabase Manager . oidc . insert Document ( client ) ĊĊĠĠĠ Ġ// fun Ġget ById ( id : ĠString ) Ġ= ĠDatabase Manager . oidc . getDocument ( id , ĠO id c Client :: class . java ) ĊĊĠĠĠ Ġ// ĠTODO Ġreplace Ġwith Ġsession Ġcache ĊĠĠĠ Ġvar Ġauth Req : ĠO id c Authentication Request ? Ġ= Ġnull ĊĊĠĠĠ Ġ// fun Ġregister ( req : ĠO id c Register Request ) Ġ= ĠO id c Client . new Client ( req ). also Ġ{ Ġinsert Client ( it ) Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠReturns Ġthe ĠAuthentication ĠEndpoint Ġor Ġan ĠError ĠResponse ĠURL ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġauthorize ( req : ĠO id c Authentication Request ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġlog . info (" Authentication ĠRequest : Ġ Ġ$ req ") ĊĊĠĠĠĠĠĠĠ Ġ// ĠTODO Ġcheck Ġif Ġuser Ġis Ġauthenticated Ġalready . Ġif Ġnot Ġ-> Ġlogin ; Ġelse Ġ-> Ġconsent ; ĊĠĠĠĠĠĠĠ Ġval Ġauthentication Response Ġ= Ġ" https :// let str ust . id / user / login ? scope = openid " ĊĊĠĠĠĠĠĠĠ Ġ// ĠTODO Ġerror Ġhandling Ġaccording Ġto Ġhttps :// openid . net / specs / openid - connect - core - 1 _ 0 . html # Auth Error ĊĠĠĠĠĠĠĠ Ġ// ĠIf Ġthe Ġredirect _ uri Ġis Ġvalid , Ġthe Ġerror - codes Ġwill Ġbe Ġsent Ġto Ġthis Ġpage ĊĠĠĠĠĠĠĠ Ġval Ġauthentication ErrorResponse : ĠString ? Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnull Ġ// Ġe . g . ĠHTTP / 1 . 1 Ġ 3 0 2 ĠFound Ġ ĠLocation : Ġhttps :// client . example . org / cb ? error = invalid _ request & error _ description = Unsupported % 2 0 response _ type % 2 0 value & state = af 0 if js ld kj ĊĊĠĠĠĠĠĠĠ Ġ// Ġcheck Ġif Ġthe Ġclient _ id Ġis Ġvalid ĊĠĠĠĠĠĠĠ Ġ// val Ġclient Ġ= Ġload Checked Client ( req ) ĊĊĠĠĠĠĠĠĠ Ġ// Ġcheck Ġif Ġredirect _ uri Ġmatches Ġthe Ġpre - registered Ġone ĊĠĠĠĠĠĠĠ Ġ// if Ġ( client . redirect U ris . contains ( req . redirect Uri )) Ġthrow Ġjava . lang . IllegalArgumentException (" Invalid Ġredirect ĠURI ") ĊĊĠĠĠĠĠĠĠ Ġ// ĠTODO : Ġcheck Ġif Ġthe Ġscope Ġ+ Ġresponse _ type Ġare Ġvalid ĊĊĠĠĠĠĠĠĠ Ġ// ĠTODO : ĠShould Ġbe Ġstored Ġin Ġsession - cache ĊĠĠĠĠĠĠĠ Ġauth Req Ġ= Ġreq ĊĊĠĠĠĠĠĠĠ Ġreturn Ġauthentication ErrorResponse Ġ?: Ġauthentication Response ĊĠĠĠ Ġ} Ċ Ċ // ĠĠĠ Ġprivate Ġfun Ġload Checked Client ( req : ĠO id c Authentication Request ): ĠO id c Client Ġ{ Ċ // ĠĠĠĠĠĠĠ Ġif Ġ( req . clientId . isNull OrEmpty ()) Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġerror (" invalid Ġclient ĠID : Ġ${ req . clientId }") Ċ // Ċ // ĠĠĠĠĠĠĠ Ġreturn Ġget ById ( req . clientId !! ) Ġ?: Ġerror (" Could Ġnot Ġload ĠO IDC Ġclient Ġby ĠID Ġ${ req . clientId }") Ċ // ĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġconsent ( req : ĠO id c Consent Request ): ĠO id c Consent Response Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠTODO Ġgenerate Ġcode Ġand Ġstore Ġit Ġwithin Ġthe Ġuser Ġsession ĊĠĠĠĠĠĠĠ Ġval Ġcode Ġ= Ġ" Spl xl O Be Z QQ Y b YS 6 Wx Sb IA " ĊĠĠĠĠĠĠĠ Ġval Ġoid c Authentication Response Url Ġ= Ġ"${ auth Req !!. redirect Uri }? code =${ code }& state =${ auth Req !!. state }" ĊĊĠĠĠĠĠĠĠ Ġlog . info (" Redirect ing Ġto : Ġ Ġ$ oidc Authentication Response Url ") ĊĊĠĠĠĠĠĠĠ Ġ// ĠTODO Ġconsider Ġerror Ġhandling ĊĠĠĠĠĠĠĠ Ġreturn ĠO id c Consent Response ( oidc Authentication Response Url ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġtoken ( req : ĠO id c Token Request ): ĠO id c Token Response Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠTODO ĠValidate ĠToken ĠRequest Ġhttps :// openid . net / specs / openid - connect - core - 1 _ 0 . html # Token Request Validation ĊĊĠĠĠĠĠĠĠ Ġ// ĠTODO Ġvalidate Ġclient _ id Ġand Ġclient _ secret ĊĊĠĠĠĠĠĠĠ Ġ// ĠTODO Ġvalidate Ġcode Ġ( may Ġonly Ġbe Ġused Ġonce Ġand Ġhas Ġto Ġexpire Ġwithin Ġ 1 0 min ) Ġhttps :// tools . ietf . org / html / rfc 6 7 4 9 # section - 4 . 1 . 2 ĊĊĠĠĠĠĠĠĠ Ġ// ĠTODO Ġvalidate Ġand Ġredirect _ url ĊĊĠĠĠĠĠĠĠ Ġ// ĠTODO Ġerror Ġhandling ĊĊĠĠĠĠĠĠĠ Ġ// ĠTODO Ġgenerate ĠAccess ĠToken ĊĊĠĠĠĠĠĠĠ Ġ// ĠTODO Ġgenerate ĠID _ TOKEN ĊĊĠĠĠĠĠĠĠ Ġreturn ĠO id c Token Response ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" Sl AV 3 2 hk KG ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" Bearer ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ"", ĊĠĠĠĠĠĠĠĠĠĠĠĠ 3 6 0 0 , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" ey J hb G ci OiJ SU z I 1 Ni IsIm tp ZCI 6 Ij Fl OW dk az cif Q . ew og I ml z cy I 6 IC J od HR w Oi 8 vc 2 Vy dm Vy L mV 4 YW 1 wb GU u Y 2 9 t Iiw K IC J zd WI i Oi Ai Mj Q 4 Mj g 5 Nz Yx MD Ax Iiw K IC J hd W Qi Oi A ic z Z Ca GR Sa 3 F 0 My Is Ci A ibm 9 u Y 2 Ui Oi A ib i 0 w Uz Z f V 3 p BM k 1 q Iiw K IC J le HA i Oi Ax Mz Ex Mj gx OT cw LA og I ml hd CI 6 IDE zM TE y O DA 5 Nz AK f Q . gg W 8 h Z 1 Eu VL ux Nu u IJ KX _ V 8 a _ OM Xz R 0 E HR 9 R 6 j gd qr O OF 4 da GU 9 6 Sr _ P 6 q Jp 6 I cm D 3 HP 9 9 Ob i 1 PR s - c wh 3 LO - p 1 4 6 wa J 8 I he hc w L 7 F 0 9 J di jm B q kv Pe B 2 T 9 C JN qe G pe - gcc Mg 4 vf K jk M 8 Fc G vn z Z UN 4 _ K SP 0 a Ap 1 t O J 1 z Z wg jx q G By K Hi Ot X 7 T pd Qy HE 5 lc Mi KP Xf E IQ IL Vq 0 pc _ E 2 D zL 7 em op Wo ao Z TF _ m 0 _ N 0 Yz FC 6 g 6 E Jb OE o Ro SK 5 ho Dal rcv RY LS r Q AZ ZK fly u VC y ix Eo V 9 Gf N QC 3 _ os j zw 2 PA ith f ub EE BL u V Vk 4 X UV r W OL r Ll 0 nx 7 Rk KU 8 NX NH q - rv K Mz qg " ĊĠĠĠĠĠĠĠ Ġ) Ċ // ĠĠĠĠĠĠĠ Ġreturn Ġmap Of ( Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġ" id _ token " Ġto Ġ" ey J hb G ci OiJ SU z I 1 Ni IsIm tp ZCI 6 Ij Fl OW dk az cif Q . ew og I ml z cy I 6 IC J od HR w Oi 8 vc 2 Vy dm Vy L mV 4 YW 1 wb GU u Y 2 9 t Iiw K IC J zd WI i Oi Ai Mj Q 4 Mj g 5 Nz Yx MD Ax Iiw K IC J hd W Qi Oi A ic z Z Ca GR Sa 3 F 0 My Is Ci A ibm 9 u Y 2 Ui Oi A ib i 0 w Uz Z f V 3 p BM k 1 q Iiw K IC J le HA i Oi Ax Mz Ex Mj gx OT cw LA og I ml hd CI 6 IDE zM TE y O DA 5 Nz AK f Q . gg W 8 h Z 1 Eu VL ux Nu u IJ KX _ V 8 a _ OM Xz R 0 E HR 9 R 6 j gd qr O OF 4 da GU 9 6 Sr _ P 6 q Jp 6 I cm D 3 HP 9 9 Ob i 1 PR s - c wh 3 LO - p 1 4 6 wa J 8 I he hc w L 7 F 0 9 J di jm B q kv Pe B 2 T 9 C JN qe G pe - gcc Mg 4 vf K jk M 8 Fc G vn z Z UN 4 _ K SP 0 a Ap 1 t O J 1 z Z wg jx q G By K Hi Ot X 7 T pd Qy HE 5 lc Mi KP Xf E IQ IL Vq 0 pc _ E 2 D zL 7 em op Wo ao Z TF _ m 0 _ N 0 Yz FC 6 g 6 E Jb OE o Ro SK 5 ho Dal rcv RY LS r Q AZ ZK fly u VC y ix Eo V 9 Gf N QC 3 _ os j zw 2 PA ith f ub EE BL u V Vk 4 X UV r W OL r Ll 0 nx 7 Rk KU 8 NX NH q - rv K Mz qg ", Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġ" access _ token " Ġto Ġ" Sl AV 3 2 hk KG ", Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġ" token _ type " Ġto Ġ" Bearer ", Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġ" expires _ in " Ġto Ġ" 3 6 0 0 " Ċ // ĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġint rospect ( req : ĠO id c Intro spec Request ): ĠMap < String , ĠAny > Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠTODO Ġimplement ĊĠĠĠĠĠĠĠ Ġreturn Ġmap Of ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" active " Ġto Ġtrue , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" scope " Ġto Ġ" read Ġwrite Ġemail ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" client _ id " Ġto Ġ" Sl AV 3 2 hk KG ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" username " Ġto Ġ" phil ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" exp " Ġto Ġ 1 4 3 7 2 7 5 3 1 1 , ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġre voke ( req : ĠO id c Re voke Request ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠTODO Ġimplement ĊĠĠĠĠĠĠĠ Ġreturn Ġ 2 0 0 ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// Ġhttps :// openid . net / specs / openid - connect - core - 1 _ 0 . html # UserInfo ĊĠĠĠ Ġfun Ġuser info (): ĠO id c UserInfo Response Ġ{ Ġ// Map < String , ĠAny > Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠTODO Ġvalidate Ġbe arer Ġtoken ĊĊĠĠĠĠĠĠĠ Ġ// ĠTODO Ġfetch Ġuser Ġdetails Ġfrom Ġdatabase ĊĊĠĠĠĠĠĠĠ Ġ// ĠTODO ĠBuild Ġand Ġsign Ġresponse Ġaccording Ġto Ġhttps :// openid . net / specs / openid - connect - core - 1 _ 0 . html # UserInfo Response ĊĊĠĠĠĠĠĠĠ Ġval Ġresp Ġ= ĠO id c UserInfo Response (" 1 2 3 4 9 8 7 6 ") ĊĊĠĠĠĠĠĠĠ Ġresp . set Map ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhash Map Of ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" email " Ġto Ġ" dom in ik . ber on @ let str ust . io ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" email _ verified " Ġto Ġtrue , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" picture " Ġto Ġ" https :// let str ust . id / assets / img / demo / profile _ img . png ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" name " Ġto Ġ" Dom in ik ĠBer on ", ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" address " Ġto Ġmap Of ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" street _ address " Ġto Ġ" 1 2 3 ĠHol ly wood ĠB lv d .", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" locality " Ġto Ġ" Los ĠAnge les ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" region " Ġto Ġ" CA ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" postal _ code " Ġto Ġ" 9 0 2 1 0 ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" country " Ġto Ġ" US " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ), ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" skills " Ġto Ġmap Of ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" java " Ġto ĠlistOf (" 1 ", Ġ" 2 "), Ġ// ĠCredential IDs Ġshould Ġbe ĠUUID s ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" php " Ġto ĠlistOf (" 3 ", Ġ" 4 "), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" oop " Ġto ĠlistOf (" 1 ", Ġ" 3 ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ), ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" education " Ġto ĠlistOf (" 5 ", Ġ" 6 "), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" work _ history " Ġto ĠlistOf (" 7 ", Ġ" 8 ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġ/* ĊĠĠĠĠĠĠĠ Ġresp . add ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" address ", Ġmap Of ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" street _ address " Ġto Ġ" 1 2 3 ĠHol ly wood ĠB lv d .", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" locality " Ġto Ġ" Los ĠAnge les ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" region " Ġto Ġ" CA ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" postal _ code " Ġto Ġ" 9 0 2 1 0 ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" country " Ġto Ġ" US " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ) */ ĊĊĠĠĠĠĠĠĠ Ġreturn Ġresp Ċ Ċ // ĠĠĠĠĠĠĠ Ġreturn Ġmap Of ( Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġ" sub " Ġto Ġ" alice ", Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġ" email " Ġto Ġ" alice @ w onder land . net ", Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġ" email _ verified " Ġto Ġtrue , Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġ" name " Ġto Ġ" Alice ĠAd ams ", Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġ" picture " Ġto Ġ" https :// c 2 id . com / users / alice . jpg ", Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġ" address " Ġto Ġmap Of ( Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" street _ address " Ġto Ġ" 1 2 3 ĠHol ly wood ĠB lv d .", Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" locality " Ġto Ġ" Los ĠAnge les ", Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" region " Ġto Ġ" CA ", Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" postal _ code " Ġto Ġ" 9 0 2 1 0 ", Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" country " Ġto Ġ" US "), Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġ" skills " Ġto Ġmap Of ( Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" java " Ġto ĠlistOf (" 1 ", Ġ" 2 "), Ġ// ĠCredential IDs Ġshould Ġbe ĠUUID s Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" php " Ġto ĠlistOf (" 3 ", Ġ" 4 "), Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" oop " Ġto ĠlistOf (" 1 ", Ġ" 3 ") Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġ), Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġ" education " Ġto ĠlistOf (" 5 ", Ġ" 6 "), Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġ" work _ history " Ġto ĠlistOf (" 7 ", Ġ" 8 "), Ċ // ĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} Ċ } Ċ