Skip to content

Commit fd3095d

Browse files
RowanErasmuschrisknoll
authored andcommitted
Enable OIDC authentication with a direct client
1 parent 8c8af00 commit fd3095d

3 files changed

Lines changed: 37 additions & 8 deletions

File tree

pom.xml

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -951,6 +951,17 @@
951951
</exclusion>
952952
</exclusions>
953953
</dependency>
954+
<dependency>
955+
<groupId>org.pac4j</groupId>
956+
<artifactId>pac4j-http</artifactId>
957+
<version>${pac4j.version}</version>
958+
<exclusions>
959+
<exclusion>
960+
<groupId>com.fasterxml.jackson.core</groupId>
961+
<artifactId>jackson-databind</artifactId>
962+
</exclusion>
963+
</exclusions>
964+
</dependency>
954965
<dependency>
955966
<groupId>org.pac4j</groupId>
956967
<artifactId>pac4j-saml-opensamlv3</artifactId>

src/main/java/org/ohdsi/webapi/shiro/management/AtlasRegularSecurity.java

Lines changed: 25 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -38,11 +38,13 @@
3838
import org.pac4j.core.http.callback.CallbackUrlResolver;
3939
import org.pac4j.core.http.callback.PathParameterCallbackUrlResolver;
4040
import org.pac4j.core.http.callback.QueryParameterCallbackUrlResolver;
41+
import org.pac4j.http.client.direct.HeaderClient;
4142
import org.pac4j.oauth.client.FacebookClient;
4243
import org.pac4j.oauth.client.GitHubClient;
4344
import org.pac4j.oauth.client.Google2Client;
4445
import org.pac4j.oidc.client.OidcClient;
4546
import org.pac4j.oidc.config.OidcConfiguration;
47+
import org.pac4j.oidc.credentials.authenticator.UserInfoOidcAuthenticator;
4648
import org.pac4j.saml.client.SAML2Client;
4749
import org.pac4j.saml.config.SAML2Configuration;
4850
import org.slf4j.Logger;
@@ -322,11 +324,19 @@ public Map<FilterTemplates, Filter> getFilters() {
322324

323325
if (this.openidAuthEnabled) {
324326
OidcConfiguration configuration = oidcConfCreator.build();
325-
OidcClient oidcClient = new OidcClient(configuration);
326-
oidcClient.setCallbackUrl(oauthApiCallback);
327-
oidcClient.setCallbackUrlResolver(urlResolver);
328327
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);
329333
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");
330340
}
331341
}
332342

@@ -366,6 +376,11 @@ public Map<FilterTemplates, Filter> getFilters() {
366376
oidcFilter.setConfig(cfg);
367377
oidcFilter.setClients("OidcClient");
368378
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);
369384
}
370385

371386
CallbackFilter callbackFilter = new CallbackFilter();
@@ -409,7 +424,9 @@ protected FilterChainBuilder getFilterChainBuilder() {
409424
}
410425

411426
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);
413430
}
414431

415432
if (this.googleAuthEnabled) {
@@ -453,11 +470,11 @@ protected FilterChainBuilder getFilterChainBuilder() {
453470

454471
if (this.samlEnabled) {
455472
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);
459476
}
460-
477+
461478
setupProtectedPaths(filterChainBuilder);
462479

463480
return filterChainBuilder.addRestPath("/**");

src/main/java/org/ohdsi/webapi/shiro/management/FilterTemplates.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ public enum FilterTemplates {
3131
LDAP_FILTER("ldapFilter"),
3232
AD_FILTER("adFilter"),
3333
OIDC_AUTH("oidcAuth"),
34+
OIDC_DIRECT_AUTH("oidcDirectAuth"),
3435
OAUTH_CALLBACK("oauthCallback"),
3536
HANDLE_UNSUCCESSFUL_OAUTH("handleUnsuccessfullOAuth"),
3637
HANDLE_CAS("handleCas"),

0 commit comments

Comments
 (0)