11/*
2- * Copyright 2020 the original author or authors.
2+ * Copyright 2021 the original author or authors.
33 *
44 * Licensed under the Apache License, Version 2.0 (the "License");
55 * you may not use this file except in compliance with the License.
1515 */
1616package org .springframework .security .oauth2 .core .oidc .http .converter ;
1717
18+ import java .util .HashMap ;
19+ import java .util .Map ;
20+
1821import org .springframework .core .ParameterizedTypeReference ;
1922import org .springframework .core .convert .TypeDescriptor ;
2023import org .springframework .core .convert .converter .Converter ;
2124import org .springframework .http .HttpInputMessage ;
2225import org .springframework .http .HttpOutputMessage ;
2326import org .springframework .http .MediaType ;
24- import org .springframework .http .converter .HttpMessageConverter ;
27+ import org .springframework .http .converter .AbstractHttpMessageConverter ;
2528import org .springframework .http .converter .GenericHttpMessageConverter ;
26- import org .springframework .http .converter .HttpMessageNotWritableException ;
29+ import org .springframework .http .converter .HttpMessageConverter ;
2730import org .springframework .http .converter .HttpMessageNotReadableException ;
28- import org .springframework .http .converter .AbstractHttpMessageConverter ;
31+ import org .springframework .http .converter .HttpMessageNotWritableException ;
2932import org .springframework .security .oauth2 .core .converter .ClaimConversionService ;
3033import org .springframework .security .oauth2 .core .converter .ClaimTypeConverter ;
3134import org .springframework .security .oauth2 .core .oidc .OidcUserInfo ;
3235import org .springframework .security .oauth2 .core .oidc .StandardClaimNames ;
3336import org .springframework .util .Assert ;
3437
35- import java .util .HashMap ;
36- import java .util .Map ;
37-
3838/**
39- * A {@link HttpMessageConverter} for an {@link OidcUserInfo OIDC User Info Response}.
39+ * A {@link HttpMessageConverter} for an {@link OidcUserInfo OAuth 2.0 Protected Resource UserInfo Response}.
4040 *
4141 * @author Ido Salomon
42+ * @author Steve Riesenberg
43+ * @since 0.2.1
4244 * @see AbstractHttpMessageConverter
4345 * @see OidcUserInfo
44- * @since 0.1.1
4546 */
4647public class OidcUserInfoHttpMessageConverter extends AbstractHttpMessageConverter <OidcUserInfo > {
4748
4849 private static final ParameterizedTypeReference <Map <String , Object >> STRING_OBJECT_MAP =
49- new ParameterizedTypeReference <Map <String , Object >>() {
50- };
50+ new ParameterizedTypeReference <Map <String , Object >>() {};
5151
52- private final GenericHttpMessageConverter <Object > jsonMessageConverter = HttpMessageConverters .getJsonMessageConverter ();
52+ private final GenericHttpMessageConverter <Object > jsonMessageConverter =
53+ HttpMessageConverters .getJsonMessageConverter ();
5354
54- private Converter <Map <String , Object >, OidcUserInfo > oidcUserInfoConverter = new OidcUserInfoConverter ();
55- private Converter <OidcUserInfo , Map <String , Object >> oidcUserInfoParametersConverter = OidcUserInfo ::getClaims ;
55+ private Converter <Map <String , Object >, OidcUserInfo > userInfoConverter = new OidcUserInfoConverter ();
56+ private Converter <OidcUserInfo , Map <String , Object >> userInfoParametersConverter = OidcUserInfo ::getClaims ;
5657
5758 public OidcUserInfoHttpMessageConverter () {
5859 super (MediaType .APPLICATION_JSON , new MediaType ("application" , "*+json" ));
@@ -68,89 +69,91 @@ protected boolean supports(Class<?> clazz) {
6869 protected OidcUserInfo readInternal (Class <? extends OidcUserInfo > clazz , HttpInputMessage inputMessage )
6970 throws HttpMessageNotReadableException {
7071 try {
71- Map <String , Object > oidcUserInfoParameters =
72+ Map <String , Object > userInfoParameters =
7273 (Map <String , Object >) this .jsonMessageConverter .read (STRING_OBJECT_MAP .getType (), null , inputMessage );
73- return this .oidcUserInfoConverter .convert (oidcUserInfoParameters );
74+ return this .userInfoConverter .convert (userInfoParameters );
7475 } catch (Exception ex ) {
7576 throw new HttpMessageNotReadableException (
76- "An error occurred reading the OIDC User Info : " + ex .getMessage (), ex , inputMessage );
77+ "An error occurred reading the UserInfo : " + ex .getMessage (), ex , inputMessage );
7778 }
7879 }
7980
8081 @ Override
8182 protected void writeInternal (OidcUserInfo oidcUserInfo , HttpOutputMessage outputMessage )
8283 throws HttpMessageNotWritableException {
8384 try {
84- Map <String , Object > oidcUserInfoResponseParameters =
85- this .oidcUserInfoParametersConverter .convert (oidcUserInfo );
85+ Map <String , Object > userInfoResponseParameters =
86+ this .userInfoParametersConverter .convert (oidcUserInfo );
8687 this .jsonMessageConverter .write (
87- oidcUserInfoResponseParameters ,
88+ userInfoResponseParameters ,
8889 STRING_OBJECT_MAP .getType (),
8990 MediaType .APPLICATION_JSON ,
9091 outputMessage
9192 );
9293 } catch (Exception ex ) {
9394 throw new HttpMessageNotWritableException (
94- "An error occurred writing the OIDC User Info response: " + ex .getMessage (), ex );
95+ "An error occurred writing the OAuth 2.0 Protected Resource UserInfo response: " + ex .getMessage (), ex );
9596 }
9697 }
9798
9899 /**
99- * Sets the {@link Converter} used for converting the OIDC User Info parameters
100+ * Sets the {@link Converter} used for converting the UserInfo parameters
100101 * to an {@link OidcUserInfo}.
101102 *
102- * @param oidcUserInfoConverter the {@link Converter} used for converting to an
103- * {@link OidcUserInfo}
103+ * @param userInfoConverter the {@link Converter} used for converting to an
104+ * {@link OidcUserInfo}
104105 */
105- public final void setOidcUserInfoConverter (Converter <Map <String , Object >, OidcUserInfo > oidcUserInfoConverter ) {
106- Assert .notNull (oidcUserInfoConverter , "oidcUserInfoConverter cannot be null" );
107- this .oidcUserInfoConverter = oidcUserInfoConverter ;
106+ public final void setUserInfoConverter (Converter <Map <String , Object >, OidcUserInfo > userInfoConverter ) {
107+ Assert .notNull (userInfoConverter , "userInfoConverter cannot be null" );
108+ this .userInfoConverter = userInfoConverter ;
108109 }
109110
110111 /**
111112 * Sets the {@link Converter} used for converting the {@link OidcUserInfo} to a
112- * {@code Map} representation of the OIDC User Info .
113+ * {@code Map} representation of the UserInfo .
113114 *
114- * @param oidcUserInfoParametersConverter the {@link Converter} used for converting to a
115- * {@code Map} representation of the OIDC User Info
115+ * @param userInfoParametersConverter the {@link Converter} used for converting to a
116+ * {@code Map} representation of the UserInfo
116117 */
117- public final void setOidcUserInfoParametersConverter (
118- Converter <OidcUserInfo , Map <String , Object >> oidcUserInfoParametersConverter ) {
119- Assert .notNull (oidcUserInfoParametersConverter , "oidcUserInfoParametersConverter cannot be null" );
120- this .oidcUserInfoParametersConverter = oidcUserInfoParametersConverter ;
118+ public final void setUserInfoParametersConverter (
119+ Converter <OidcUserInfo , Map <String , Object >> userInfoParametersConverter ) {
120+ Assert .notNull (userInfoParametersConverter , "oidcUserInfoParametersConverter cannot be null" );
121+ this .userInfoParametersConverter = userInfoParametersConverter ;
121122 }
122123
123124 private static final class OidcUserInfoConverter implements Converter <Map <String , Object >, OidcUserInfo > {
124125 private static final ClaimConversionService CLAIM_CONVERSION_SERVICE = ClaimConversionService .getSharedInstance ();
125126 private static final TypeDescriptor OBJECT_TYPE_DESCRIPTOR = TypeDescriptor .valueOf (Object .class );
126127 private static final TypeDescriptor BOOLEAN_TYPE_DESCRIPTOR = TypeDescriptor .valueOf (Boolean .class );
127128 private static final TypeDescriptor STRING_TYPE_DESCRIPTOR = TypeDescriptor .valueOf (String .class );
129+ private static final TypeDescriptor STRING_OBJECT_MAP_DESCRIPTOR = TypeDescriptor .map (Map .class , STRING_TYPE_DESCRIPTOR , OBJECT_TYPE_DESCRIPTOR );
128130 private final ClaimTypeConverter claimTypeConverter ;
129131
130132 private OidcUserInfoConverter () {
131133 Converter <Object , ?> stringConverter = getConverter (STRING_TYPE_DESCRIPTOR );
132134 Converter <Object , ?> booleanConverter = getConverter (BOOLEAN_TYPE_DESCRIPTOR );
135+ Converter <Object , ?> mapConverter = getConverter (STRING_OBJECT_MAP_DESCRIPTOR );
133136
134137 Map <String , Converter <Object , ?>> claimConverters = new HashMap <>();
135138 claimConverters .put (StandardClaimNames .SUB , stringConverter );
136- claimConverters .put (StandardClaimNames .PROFILE , stringConverter );
137- claimConverters .put (StandardClaimNames .ADDRESS , stringConverter );
138- claimConverters .put (StandardClaimNames .BIRTHDATE , stringConverter );
139- claimConverters .put (StandardClaimNames .EMAIL , stringConverter );
140- claimConverters .put (StandardClaimNames .EMAIL_VERIFIED , booleanConverter );
141139 claimConverters .put (StandardClaimNames .NAME , stringConverter );
142140 claimConverters .put (StandardClaimNames .GIVEN_NAME , stringConverter );
143- claimConverters .put (StandardClaimNames .MIDDLE_NAME , stringConverter );
144141 claimConverters .put (StandardClaimNames .FAMILY_NAME , stringConverter );
142+ claimConverters .put (StandardClaimNames .MIDDLE_NAME , stringConverter );
145143 claimConverters .put (StandardClaimNames .NICKNAME , stringConverter );
146144 claimConverters .put (StandardClaimNames .PREFERRED_USERNAME , stringConverter );
147- claimConverters .put (StandardClaimNames .LOCALE , stringConverter );
148- claimConverters .put (StandardClaimNames .GENDER , stringConverter );
149- claimConverters .put (StandardClaimNames .PHONE_NUMBER , stringConverter );
150- claimConverters .put (StandardClaimNames .PHONE_NUMBER_VERIFIED , stringConverter );
145+ claimConverters .put (StandardClaimNames .PROFILE , stringConverter );
151146 claimConverters .put (StandardClaimNames .PICTURE , stringConverter );
152- claimConverters .put (StandardClaimNames .ZONEINFO , stringConverter );
153147 claimConverters .put (StandardClaimNames .WEBSITE , stringConverter );
148+ claimConverters .put (StandardClaimNames .EMAIL , stringConverter );
149+ claimConverters .put (StandardClaimNames .EMAIL_VERIFIED , booleanConverter );
150+ claimConverters .put (StandardClaimNames .GENDER , stringConverter );
151+ claimConverters .put (StandardClaimNames .BIRTHDATE , stringConverter );
152+ claimConverters .put (StandardClaimNames .ZONEINFO , stringConverter );
153+ claimConverters .put (StandardClaimNames .LOCALE , stringConverter );
154+ claimConverters .put (StandardClaimNames .PHONE_NUMBER , stringConverter );
155+ claimConverters .put (StandardClaimNames .PHONE_NUMBER_VERIFIED , booleanConverter );
156+ claimConverters .put (StandardClaimNames .ADDRESS , mapConverter );
154157 claimConverters .put (StandardClaimNames .UPDATED_AT , stringConverter );
155158
156159 this .claimTypeConverter = new ClaimTypeConverter (claimConverters );
0 commit comments