|
38 | 38 | import org.pac4j.core.http.callback.CallbackUrlResolver; |
39 | 39 | import org.pac4j.core.http.callback.PathParameterCallbackUrlResolver; |
40 | 40 | import org.pac4j.core.http.callback.QueryParameterCallbackUrlResolver; |
| 41 | +import org.pac4j.http.client.direct.HeaderClient; |
41 | 42 | import org.pac4j.oauth.client.FacebookClient; |
42 | 43 | import org.pac4j.oauth.client.GitHubClient; |
43 | 44 | import org.pac4j.oauth.client.Google2Client; |
44 | 45 | import org.pac4j.oidc.client.OidcClient; |
45 | 46 | import org.pac4j.oidc.config.OidcConfiguration; |
| 47 | +import org.pac4j.oidc.credentials.authenticator.UserInfoOidcAuthenticator; |
46 | 48 | import org.pac4j.saml.client.SAML2Client; |
47 | 49 | import org.pac4j.saml.config.SAML2Configuration; |
48 | 50 | import org.slf4j.Logger; |
@@ -322,11 +324,19 @@ public Map<FilterTemplates, Filter> getFilters() { |
322 | 324 |
|
323 | 325 | if (this.openidAuthEnabled) { |
324 | 326 | OidcConfiguration configuration = oidcConfCreator.build(); |
325 | | - OidcClient oidcClient = new OidcClient(configuration); |
326 | | - oidcClient.setCallbackUrl(oauthApiCallback); |
327 | | - oidcClient.setCallbackUrlResolver(urlResolver); |
328 | 327 | if (StringUtils.isNotBlank(configuration.getClientId())) { |
| 328 | + // https://www.pac4j.org/4.0.x/docs/clients/openid-connect.html |
| 329 | + // OidcClient allows indirect login through UI with code flow |
| 330 | + OidcClient oidcClient = new OidcClient(configuration); |
| 331 | + oidcClient.setCallbackUrl(oauthApiCallback); |
| 332 | + oidcClient.setCallbackUrlResolver(urlResolver); |
329 | 333 | clients.add(oidcClient); |
| 334 | + // HeaderClient allows api access with a bearer token from the identity provider |
| 335 | + UserInfoOidcAuthenticator authenticator = new UserInfoOidcAuthenticator(configuration); |
| 336 | + HeaderClient headerClient = new HeaderClient("Authorization", "Bearer ", authenticator); |
| 337 | + clients.add(headerClient); |
| 338 | + } else { |
| 339 | + logger.warn("openidAuth is enabled but no client id is provided"); |
330 | 340 | } |
331 | 341 | } |
332 | 342 |
|
@@ -366,6 +376,11 @@ public Map<FilterTemplates, Filter> getFilters() { |
366 | 376 | oidcFilter.setConfig(cfg); |
367 | 377 | oidcFilter.setClients("OidcClient"); |
368 | 378 | filters.put(OIDC_AUTH, oidcFilter); |
| 379 | + |
| 380 | + SecurityFilter oidcDirectFilter = new SecurityFilter(); |
| 381 | + oidcDirectFilter.setConfig(cfg); |
| 382 | + oidcDirectFilter.setClients("HeaderClient"); |
| 383 | + filters.put(OIDC_DIRECT_AUTH, oidcDirectFilter); |
369 | 384 | } |
370 | 385 |
|
371 | 386 | CallbackFilter callbackFilter = new CallbackFilter(); |
@@ -409,7 +424,9 @@ protected FilterChainBuilder getFilterChainBuilder() { |
409 | 424 | } |
410 | 425 |
|
411 | 426 | if (this.openidAuthEnabled) { |
412 | | - filterChainBuilder.addRestPath("/user/login/openid", FORCE_SESSION_CREATION, OIDC_AUTH, UPDATE_TOKEN, SEND_TOKEN_IN_URL); |
| 427 | + filterChainBuilder |
| 428 | + .addRestPath("/user/login/openid", FORCE_SESSION_CREATION, OIDC_AUTH, UPDATE_TOKEN, SEND_TOKEN_IN_URL) |
| 429 | + .addRestPath("/user/login/openidDirect", FORCE_SESSION_CREATION, OIDC_DIRECT_AUTH, UPDATE_TOKEN, SEND_TOKEN_IN_HEADER); |
413 | 430 | } |
414 | 431 |
|
415 | 432 | if (this.googleAuthEnabled) { |
@@ -453,11 +470,11 @@ protected FilterChainBuilder getFilterChainBuilder() { |
453 | 470 |
|
454 | 471 | if (this.samlEnabled) { |
455 | 472 | filterChainBuilder |
456 | | - .addPath("/user/login/saml", SSL, CORS, FORCE_SESSION_CREATION, SAML_AUTHC, UPDATE_TOKEN, SEND_TOKEN_IN_URL) |
457 | | - .addPath("/user/login/samlForce", SSL, CORS, FORCE_SESSION_CREATION, SAML_AUTHC_FORCE, UPDATE_TOKEN, SEND_TOKEN_IN_URL) |
458 | | - .addPath("/user/saml/callback", SSL, HANDLE_SAML, UPDATE_TOKEN, SEND_TOKEN_IN_URL); |
| 473 | + .addPath("/user/login/saml", SSL, CORS, FORCE_SESSION_CREATION, SAML_AUTHC, UPDATE_TOKEN, SEND_TOKEN_IN_URL) |
| 474 | + .addPath("/user/login/samlForce", SSL, CORS, FORCE_SESSION_CREATION, SAML_AUTHC_FORCE, UPDATE_TOKEN, SEND_TOKEN_IN_URL) |
| 475 | + .addPath("/user/saml/callback", SSL, HANDLE_SAML, UPDATE_TOKEN, SEND_TOKEN_IN_URL); |
459 | 476 | } |
460 | | - |
| 477 | + |
461 | 478 | setupProtectedPaths(filterChainBuilder); |
462 | 479 |
|
463 | 480 | return filterChainBuilder.addRestPath("/**"); |
|
0 commit comments