@@ -11,6 +11,7 @@ use minijinja::{
1111 value:: { Enumerator , Object } ,
1212 Environment , Error , ErrorKind , Value ,
1313} ;
14+ use serde_json:: { json, Map } ;
1415
1516/// Context passed to the attribute mapping template
1617///
@@ -23,6 +24,7 @@ use minijinja::{
2324pub ( crate ) struct AttributeMappingContext {
2425 id_token_claims : Option < HashMap < String , serde_json:: Value > > ,
2526 extra_callback_parameters : Option < serde_json:: Value > ,
27+ userinfo_claims : Option < serde_json:: Value > ,
2628}
2729
2830impl AttributeMappingContext {
@@ -46,6 +48,11 @@ impl AttributeMappingContext {
4648 self
4749 }
4850
51+ pub fn with_userinfo_claims ( mut self , userinfo_claims : serde_json:: Value ) -> Self {
52+ self . userinfo_claims = Some ( userinfo_claims) ;
53+ self
54+ }
55+
4956 pub fn build ( self ) -> Value {
5057 Value :: from_object ( self )
5158 }
@@ -54,7 +61,21 @@ impl AttributeMappingContext {
5461impl Object for AttributeMappingContext {
5562 fn get_value ( self : & Arc < Self > , name : & Value ) -> Option < Value > {
5663 match name. as_str ( ) ? {
57- "user" | "id_token_claims" => self . id_token_claims . as_ref ( ) . map ( Value :: from_serialize) ,
64+ "user" => {
65+ if self . id_token_claims . is_none ( ) && self . userinfo_claims . is_none ( ) {
66+ return None ;
67+ }
68+ let mut merged_user: HashMap < String , serde_json:: Value > = HashMap :: new ( ) ;
69+ if let Some ( userinfo) = self . userinfo_claims {
70+ merged_user. extend ( userinfo. as_object ( ) . as_deref_mut ( ) ) ;
71+ }
72+ if let Some ( id_token) = self . id_token_claims {
73+ merged_user. extend ( id_token) ;
74+ }
75+ Some ( Value :: from_serialize ( merged_user) )
76+ } ,
77+ "id_token_claims" => self . id_token_claims . as_ref ( ) . map ( Value :: from_serialize) ,
78+ "userinfo_claims" => self . userinfo_claims . as_ref ( ) . map ( Value :: from_serialize) ,
5879 "extra_callback_parameters" => self
5980 . extra_callback_parameters
6081 . as_ref ( )
@@ -66,10 +87,11 @@ impl Object for AttributeMappingContext {
6687 fn enumerate ( self : & Arc < Self > ) -> Enumerator {
6788 match (
6889 self . id_token_claims . is_some ( ) ,
90+ self . userinfo_claims . is_some ( ) ,
6991 self . extra_callback_parameters . is_some ( ) ,
7092 ) {
71- ( true , true ) => {
72- Enumerator :: Str ( & [ "user" , "id_token_claims" , "extra_callback_parameters" ] )
93+ ( true , true , true ) => {
94+ Enumerator :: Str ( & [ "user" , "id_token_claims" , "userinfo_claims" , " extra_callback_parameters"] )
7395 }
7496 ( true , false ) => Enumerator :: Str ( & [ "user" , "id_token_claims" ] ) ,
7597 ( false , true ) => Enumerator :: Str ( & [ "extra_callback_parameters" ] ) ,
0 commit comments