From d14f55004cf6a65ac37ad5767e12bc408d6ea2b5 Mon Sep 17 00:00:00 2001 From: Justin Richer <jricher@mitre.org> Date: Fri, 17 Aug 2012 14:38:26 -0400 Subject: [PATCH] added parser to userinfo object, userinfo url in filter, fixed bug in user_id check --- .../client/OIDCAuthenticationFilter.java | 8 +++ .../OpenIdConnectAuthenticationProvider.java | 2 +- .../connect/client/UserInfoFetcher.java | 6 +-- .../openid/connect/model/DefaultUserInfo.java | 51 ++++++++++++++++++- 4 files changed, 62 insertions(+), 5 deletions(-) diff --git a/openid-connect-client/src/main/java/org/mitre/openid/connect/client/OIDCAuthenticationFilter.java b/openid-connect-client/src/main/java/org/mitre/openid/connect/client/OIDCAuthenticationFilter.java index 7a617723e..a039f686d 100644 --- a/openid-connect-client/src/main/java/org/mitre/openid/connect/client/OIDCAuthenticationFilter.java +++ b/openid-connect-client/src/main/java/org/mitre/openid/connect/client/OIDCAuthenticationFilter.java @@ -149,4 +149,12 @@ public class OIDCAuthenticationFilter extends AbstractOIDCAuthenticationFilter { public void setIssuer(String issuer) { oidcServerConfig.setIssuer(issuer); } + + /** + * @param userInfoUrl + * @see org.mitre.openid.connect.config.OIDCServerConfiguration#setUserInfoUrl(java.lang.String) + */ + public void setUserInfoUrl(String userInfoUrl) { + oidcServerConfig.setUserInfoUrl(userInfoUrl); + } } diff --git a/openid-connect-client/src/main/java/org/mitre/openid/connect/client/OpenIdConnectAuthenticationProvider.java b/openid-connect-client/src/main/java/org/mitre/openid/connect/client/OpenIdConnectAuthenticationProvider.java index 7b2c18a02..34936e4dc 100644 --- a/openid-connect-client/src/main/java/org/mitre/openid/connect/client/OpenIdConnectAuthenticationProvider.java +++ b/openid-connect-client/src/main/java/org/mitre/openid/connect/client/OpenIdConnectAuthenticationProvider.java @@ -82,7 +82,7 @@ public class OpenIdConnectAuthenticationProvider implements if (userInfo == null) { // TODO: user Info not found -- error? } else { - if (!Strings.isNullOrEmpty(userInfo.getUserId()) && userInfo.getUserId().equals(token.getUserId())) { + if (!Strings.isNullOrEmpty(userInfo.getUserId()) && !userInfo.getUserId().equals(token.getUserId())) { // the userinfo came back and the user_id fields don't match what was in the id_token throw new UsernameNotFoundException("user_id mismatch between id_token and user_info call: " + userInfo.getUserId() + " / " + token.getUserId()); } diff --git a/openid-connect-client/src/main/java/org/mitre/openid/connect/client/UserInfoFetcher.java b/openid-connect-client/src/main/java/org/mitre/openid/connect/client/UserInfoFetcher.java index c96accbbd..6f678cfa9 100644 --- a/openid-connect-client/src/main/java/org/mitre/openid/connect/client/UserInfoFetcher.java +++ b/openid-connect-client/src/main/java/org/mitre/openid/connect/client/UserInfoFetcher.java @@ -28,15 +28,15 @@ public class UserInfoFetcher { MultiValueMap<String, String> form = new LinkedMultiValueMap<String, String>(); form.add("access_token", token.getAccessTokenValue()); + form.add("schema", "openid"); String userInfoString = restTemplate.postForObject(token.getServerConfiguration().getUserInfoUrl(), form, String.class); JsonObject userInfoJson = new JsonParser().parse(userInfoString).getAsJsonObject(); - Gson gson = new Gson(); - DefaultUserInfo userInfo = gson.fromJson(userInfoJson, DefaultUserInfo.class); + UserInfo userInfo = DefaultUserInfo.fromJson(userInfoJson); - return new DefaultUserInfo(); + return userInfo; } diff --git a/openid-connect-common/src/main/java/org/mitre/openid/connect/model/DefaultUserInfo.java b/openid-connect-common/src/main/java/org/mitre/openid/connect/model/DefaultUserInfo.java index 36edafa1e..d631f08a2 100644 --- a/openid-connect-common/src/main/java/org/mitre/openid/connect/model/DefaultUserInfo.java +++ b/openid-connect-common/src/main/java/org/mitre/openid/connect/model/DefaultUserInfo.java @@ -27,6 +27,8 @@ import javax.persistence.NamedQuery; import javax.persistence.OneToOne; import javax.persistence.Table; +import com.google.gson.JsonObject; + @Entity @Table(name="user_info") @NamedQueries({ @@ -335,5 +337,52 @@ public class DefaultUserInfo implements UserInfo { public void setUpdatedTime(String updatedTime) { this.updatedTime = updatedTime; } - + + /** + * Parse a JsonObject into a UserInfo. + * @param o + * @return + */ + public static UserInfo fromJson(JsonObject obj) { + DefaultUserInfo ui = new DefaultUserInfo(); + + ui.setUserId(obj.has("user_id") ? obj.get("user_id").getAsString() : null); + + ui.setName(obj.has("name") ? obj.get("name").getAsString() : null); + ui.setPreferredUsername(obj.has("preferred_username") ? obj.get("preferred_username").getAsString() : null); + ui.setGivenName(obj.has("given_name") ? obj.get("given_name").getAsString() : null); + ui.setFamilyName(obj.has("family_name") ? obj.get("family_name").getAsString() : null); + ui.setMiddleName(obj.has("middle_name") ? obj.get("middle_name").getAsString() : null); + ui.setNickname(obj.has("nickname") ? obj.get("nickname").getAsString() : null); + ui.setProfile(obj.has("profile") ? obj.get("profile").getAsString() : null); + ui.setPicture(obj.has("picture") ? obj.get("picture").getAsString() : null); + ui.setWebsite(obj.has("website") ? obj.get("website").getAsString() : null); + ui.setGender(obj.has("gender") ? obj.get("gender").getAsString() : null); + ui.setZoneinfo(obj.has("zone_info") ? obj.get("zone_info").getAsString() : null); + ui.setLocale(obj.has("locale") ? obj.get("locale").getAsString() : null); + ui.setUpdatedTime(obj.has("updated_time") ? obj.get("updated_time").getAsString() : null); + + ui.setEmail(obj.has("email") ? obj.get("email").getAsString() : null); + ui.setEmailVerified(obj.has("email") ? obj.get("email_verified").getAsBoolean() : null); + + ui.setPhoneNumber(obj.has("phone_number") ? obj.get("phone_number").getAsString() : null); + + + if (obj.has("address") && obj.get("address").isJsonObject()) { + JsonObject addr = obj.get("address").getAsJsonObject(); + ui.setAddress(new Address()); + + ui.getAddress().setFormatted(addr.has("formatted") ? addr.get("formatted").getAsString() : null); + ui.getAddress().setStreetAddress(addr.has("street_address") ? addr.get("street_address").getAsString() : null); + ui.getAddress().setLocality(addr.has("locality") ? addr.get("locality").getAsString() : null); + ui.getAddress().setRegion(addr.has("region") ? addr.get("region").getAsString() : null); + ui.getAddress().setPostalCode(addr.has("postal_code") ? addr.get("postal_code").getAsString() : null); + ui.getAddress().setCountry(addr.has("country") ? addr.get("country").getAsString() : null); + + } + + + return ui; + + } }