diff --git a/openid-connect-server-webapp/src/main/webapp/resources/template/dynreg.html b/openid-connect-server-webapp/src/main/webapp/resources/template/dynreg.html index 99bf577c8..019238b66 100644 --- a/openid-connect-server-webapp/src/main/webapp/resources/template/dynreg.html +++ b/openid-connect-server-webapp/src/main/webapp/resources/template/dynreg.html @@ -264,6 +264,9 @@ + diff --git a/openid-connect-server/src/main/java/org/mitre/oauth2/service/impl/DefaultOAuth2ClientDetailsEntityService.java b/openid-connect-server/src/main/java/org/mitre/oauth2/service/impl/DefaultOAuth2ClientDetailsEntityService.java index d74449ce3..3f618cccd 100644 --- a/openid-connect-server/src/main/java/org/mitre/oauth2/service/impl/DefaultOAuth2ClientDetailsEntityService.java +++ b/openid-connect-server/src/main/java/org/mitre/oauth2/service/impl/DefaultOAuth2ClientDetailsEntityService.java @@ -108,18 +108,28 @@ public class DefaultOAuth2ClientDetailsEntityService implements ClientDetailsEnt client = generateClientId(client); } - // if the client is flagged to allow for refresh tokens, make sure it's got the right granted scopes - if (client.isAllowRefresh()) { - client.getScope().add(SystemScopeService.OFFLINE_ACCESS); - } else { - client.getScope().remove(SystemScopeService.OFFLINE_ACCESS); - } + // for refresh tokens, ensure consistency between grant types and tokens + ensureRefreshTokenConsistency(client); // timestamp this to right now client.setCreatedAt(new Date()); // check the sector URI + checkSectorIdentifierUri(client); + + + // make sure a client doesn't get any special system scopes + client.setScope(scopeService.removeRestrictedScopes(client.getScope())); + + ClientDetailsEntity c = clientRepository.saveClient(client); + + statsService.resetCache(); + + return c; + } + + private void checkSectorIdentifierUri(ClientDetailsEntity client) { if (!Strings.isNullOrEmpty(client.getSectorIdentifierUri())) { try { List redirects = sectorRedirects.get(client.getSectorIdentifierUri()); @@ -136,16 +146,13 @@ public class DefaultOAuth2ClientDetailsEntityService implements ClientDetailsEnt throw new IllegalArgumentException("Unable to load sector identifier URI: " + client.getSectorIdentifierUri()); } } + } - - // make sure a client doesn't get any special system scopes - client.setScope(scopeService.removeRestrictedScopes(client.getScope())); - - ClientDetailsEntity c = clientRepository.saveClient(client); - - statsService.resetCache(); - - return c; + private void ensureRefreshTokenConsistency(ClientDetailsEntity client) { + if (client.getAuthorizedGrantTypes().contains("refresh_token") || client.getScope().contains(SystemScopeService.OFFLINE_ACCESS)) { + client.getScope().add(SystemScopeService.OFFLINE_ACCESS); + client.getAuthorizedGrantTypes().add("refresh_token"); + } } /** @@ -230,30 +237,10 @@ public class DefaultOAuth2ClientDetailsEntityService implements ClientDetailsEnt } // if the client is flagged to allow for refresh tokens, make sure it's got the right scope - if (newClient.isAllowRefresh()) { - newClient.getScope().add(SystemScopeService.OFFLINE_ACCESS); - } else { - newClient.getScope().remove(SystemScopeService.OFFLINE_ACCESS); - } - + ensureRefreshTokenConsistency(newClient); + // check the sector URI - if (!Strings.isNullOrEmpty(newClient.getSectorIdentifierUri())) { - try { - List redirects = sectorRedirects.get(newClient.getSectorIdentifierUri()); - - if (newClient.getRegisteredRedirectUri() != null) { - for (String uri : newClient.getRegisteredRedirectUri()) { - if (!redirects.contains(uri)) { - throw new IllegalArgumentException("Requested Redirect URI " + uri + " is not listed at sector identifier " + redirects); - } - } - } - } catch (UncheckedExecutionException ue) { - throw new IllegalArgumentException("Unable to load sector identifier URI: " + newClient.getSectorIdentifierUri()); - } catch (ExecutionException e) { - throw new IllegalArgumentException("Unable to load sector identifier URI: " + newClient.getSectorIdentifierUri()); - } - } + checkSectorIdentifierUri(newClient); // make sure a client doesn't get any special system scopes newClient.setScope(scopeService.removeRestrictedScopes(newClient.getScope()));