Closed
Description
Summary
When a user's access and ID tokens expire, they should be considered invalid and refreshed using the refresh token. If unable to do so, the user's session should be expired.
Actual Behavior
currently, the behavior of HttpSecurity::oauth2Login
, when used with an openid
scope, will:
- retrieve a user's tokens at login
- not use the tokens' expiration time to dictate session lifespan
- not attempt to use refresh tokens to renew an expired session
Expected Behavior
- OpenID user sessions should be considered invalid whenever their ID token is invalid
- When using the authorization grant type, the refresh-token flow should be preferred whenever possible.
Configuration
in the WebSecurityConfigurerAdapter
:
// this actually comes from Springboot properties:
String loginPage = "/oauth2/authorization/wso2";
// ...
http
.addFilterAfter(ajaxTimeoutRedirectFilter, ExceptionTranslationFilter.class) // return 401 when attampting unauthenticated AJAX
.logout().logoutSuccessHandler(oidcLogoutRedirectHandler()).permitAll() // should go away with support in spring-security 5.2
.and()
.authorizeRequests()
.antMatchers("/censoredPage1.html").hasRole("role1")
.antMatchers("/censoredPage2.html").hasRole("role2")
.anyRequest().authenticated() // functional controllers responsible for their own authorization
.and()
.oauth2Login()
.loginPage(loginPage) // only one identity provider should be configured - just go directly there
.userInfoEndpoint().oidcUserService(userService) // add internal numeric user ID which maps to incoming subject
.and().and()
.sessionManagement().maximumSessions(1).sessionRegistry(sessionRegistry) // allows session-killing to refresh authorization grants when they change
.expiredSessionStrategy(new CallFailureSessionInformationExpiredStrategy(loginPage)); // on expired sessions: redirect synchronous requests, 401 async requests
in Spring-boot properties:
# NOTE: you need these two, but they're given by the OIDC provider (WSO2 Identity Server)
# spring.security.oauth2.client.registration.wso2.client-id =
# spring.security.oauth2.client.registration.wso2.client-secret =
# spring.security.oauth2.client.registration.wso2.client-name =
spring.security.oauth2.client.registration.wso2.provider=wso2
# Note well: The scope list MUST be separated by commas. There are multiple uses for this and some will work
# if you use spaces but others will fail in significant ways (like bypassing OIDC support and using OAuth2).
spring.security.oauth2.client.registration.wso2.scope=openid,email,phone
spring.security.oauth2.client.registration.wso2.redirect-uri-template=${my_url}/login/oauth2/code/wso2
spring.security.oauth2.client.registration.wso2.client-authentication-method=basic
spring.security.oauth2.client.registration.wso2.authorization-grant-type=authorization_code
spring.security.oauth2.client.provider.wso2.authorization-uri=${wso2.oauth2-root}/authorize
spring.security.oauth2.client.provider.wso2.token-uri=${wso2.issuer}
spring.security.oauth2.client.provider.wso2.user-info-uri=${wso2.oauth2-root}/userinfo
spring.security.oauth2.client.provider.wso2.jwk-set-uri=${wso2.oauth2-root}/jwks
spring.security.oauth2.client.provider.wso2.user-name-attribute=sub
server.port = 8443
my_hostname = https://localhost
my_url = ${my_hostname}:${server.port}
wso2.baseUrl = ${my_hostname}:9443
wso2.oauth2-root = ${wso2.baseUrl}/oauth2
wso2.issuer = ${wso2.oauth2-root}/token
Version
5.1.5 (via spring-boot 2.1.4)