Skip to content

Commit

Permalink
Merge pull request #32809 from sberyozkin/oidc_userinfo_required_opti…
Browse files Browse the repository at this point in the history
…onal

Set OIDC `user-info-required` when `UserInfo` is known to be required
  • Loading branch information
sberyozkin committed Apr 21, 2023
2 parents 4ca7cf2 + a990266 commit 67798fb
Show file tree
Hide file tree
Showing 5 changed files with 30 additions and 7 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,9 @@ public class OpaqueTokenVerificationWithUserInfoValidationTest {
@RegisterExtension
static final QuarkusUnitTest test = new QuarkusUnitTest()
.withApplicationRoot((jar) -> jar
.addAsResource(new StringAsset("quarkus.oidc.token.verify-access-token-with-user-info=true\n"),
.addAsResource(new StringAsset(
"quarkus.oidc.token.verify-access-token-with-user-info=true\n"
+ "quarkus.oidc.authentication.user-info-required=false\n"),
"application.properties"))
.assertException(t -> {
Throwable e = t;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -172,6 +172,19 @@ private Uni<TenantConfigContext> createTenantContext(Vertx vertx, OidcTenantConf
return Uni.createFrom().failure(t);
}

if (oidcConfig.roles.source.orElse(null) == Source.userinfo && !enableUserInfo(oidcConfig)) {
throw new ConfigurationException(
"UserInfo is not required but UserInfo is expected to be the source of authorization roles");
}
if (oidcConfig.token.verifyAccessTokenWithUserInfo && !enableUserInfo(oidcConfig)) {
throw new ConfigurationException(
"UserInfo is not required but 'verifyAccessTokenWithUserInfo' is enabled");
}
if (!oidcConfig.authentication.isIdTokenRequired().orElse(true) && !enableUserInfo(oidcConfig)) {
throw new ConfigurationException(
"UserInfo is not required but it will be needed to verify a code flow access token");
}

if (!oidcConfig.discoveryEnabled.orElse(true)) {
if (!isServiceApp(oidcConfig)) {
if (!oidcConfig.authorizationPath.isPresent() || !oidcConfig.tokenPath.isPresent()) {
Expand Down Expand Up @@ -226,10 +239,6 @@ private Uni<TenantConfigContext> createTenantContext(Vertx vertx, OidcTenantConf
}

if (oidcConfig.token.verifyAccessTokenWithUserInfo) {
if (!oidcConfig.authentication.isUserInfoRequired().orElse(false)) {
throw new ConfigurationException(
"UserInfo is not required but 'verifyAccessTokenWithUserInfo' is enabled");
}
if (!oidcConfig.isDiscoveryEnabled().orElse(true)) {
if (oidcConfig.userInfoPath.isEmpty()) {
throw new ConfigurationException(
Expand All @@ -251,6 +260,18 @@ public TenantConfigContext apply(OidcProvider p) {
});
}

private static boolean enableUserInfo(OidcTenantConfig oidcConfig) {
Optional<Boolean> userInfoRequired = oidcConfig.authentication.isUserInfoRequired();
if (userInfoRequired.isPresent()) {
if (!userInfoRequired.get()) {
return false;
}
} else {
oidcConfig.authentication.setUserInfoRequired(true);
}
return true;
}

private static TenantConfigContext createTenantContextFromPublicKey(OidcTenantConfig oidcConfig) {
if (!isServiceApp(oidcConfig)) {
throw new ConfigurationException("'public-key' property can only be used with the 'service' applications");
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -137,6 +137,8 @@ public OidcTenantConfig get() {
config.setTokenPath(tokenUri);
String jwksUri = uri.replace("/tenant-refresh/tenant-web-app-refresh/api/user", "/oidc/jwks");
config.setJwksPath(jwksUri);
String userInfoPath = uri.replace("/tenant-refresh/tenant-web-app-refresh/api/user", "/oidc/userinfo");
config.setUserInfoPath(userInfoPath);
config.getToken().setIssuer("any");
config.tokenStateManager.setSplitTokens(true);
config.tokenStateManager.setEncryptionRequired(false);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,6 @@ quarkus.oidc.tenant-web-app.auth-server-url=${keycloak.url}/realms/quarkus-webap
quarkus.oidc.tenant-web-app.client-id=quarkus-app-webapp
quarkus.oidc.tenant-web-app.credentials.secret=secret
quarkus.oidc.tenant-web-app.application-type=web-app
quarkus.oidc.tenant-web-app.authentication.user-info-required=true
quarkus.oidc.tenant-web-app.roles.source=userinfo
quarkus.oidc.tenant-web-app.allow-user-info-cache=false

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -56,7 +56,6 @@ quarkus.oidc.code-flow-user-info-only.authorization-path=/
quarkus.oidc.code-flow-user-info-only.token-path=access_token
quarkus.oidc.code-flow-user-info-only.user-info-path=protocol/openid-connect/userinfo
quarkus.oidc.code-flow-user-info-only.authentication.id-token-required=false
quarkus.oidc.code-flow-user-info-only.authentication.user-info-required=true
quarkus.oidc.code-flow-user-info-only.code-grant.extra-params.extra-param=extra-param-value
quarkus.oidc.code-flow-user-info-only.code-grant.headers.X-Custom=XCustomHeaderValue
quarkus.oidc.code-flow-user-info-only.client-id=quarkus-web-app
Expand Down

0 comments on commit 67798fb

Please sign in to comment.