Keycloak:Ajax调用过期后刷新访问令牌

时间:2018-06-28 21:43:10

标签: ajax spring-boot spring-security keycloak

我在herehere中遇到了相同的问题,但是他们没有得到回答,因此我获得了更多信息和不同的设置,因此不再重复。

我有一个spring boot 1.5.13应用程序,它使用带有keycloak 3.4.3服务器的spring安全适配器。一切正常,但是当我在5分钟后向应用程序发出ajax请求而不重新加载页面时,响应返回401错误。我知道这是因为访问令牌已过期。

文档规定以下内容:

  

令牌生存时间最少   在Keycloak服务器过期之前抢先刷新活动访问令牌的时间(以秒为单位)。当访问令牌发送到另一个REST客户端,在评估之前它可能过期时,这特别有用。此值不得超过域的访问令牌寿命。这是可选的。默认值为0秒,因此适配器将在访问令牌过期时刷新它。

文档here

我在keycloak.json中更改了token-minimum-time-to-live的默认值,但是我无法正常工作。

{
"realm": "APPS",
"auth-server-url": "http://localhost:9100/auth",
"ssl-required": "external",
"resource": "WebApp",
"public-client": true,
"confidential-port": 0,
"use-resource-role-mappings": true,
"principal-attribute":"preferred_username",
"token-minimum-time-to-live" : 15
}

所以我认为我在spring安全适配器配置中缺少了一些东西:

@Configuration
@EnableWebSecurity
@ComponentScan(basePackageClasses = KeycloakSecurityComponents.class)
public class SecurityConfig extends KeycloakWebSecurityConfigurerAdapter {

@Autowired
public void configureGlobal(AuthenticationManagerBuilder auth) throws   
Exception {

KeycloakAuthenticationProvider keycloakAuthenticationProvider = 
keycloakAuthenticationProvider();

keycloakAuthenticationProvider.setGrantedAuthoritiesMapper(new 
SimpleAuthorityMapper());
    auth.authenticationProvider(keycloakAuthenticationProvider);
}

@Bean
@Override
protected SessionAuthenticationStrategy sessionAuthenticationStrategy() {
    return new RegisterSessionAuthenticationStrategy(new SessionRegistryImpl());
}

@Bean
ServletListenerRegistrationBean<HttpSessionEventPublisher> getHttpSessionEventPublisher() {
    return new ServletListenerRegistrationBean<HttpSessionEventPublisher>(new HttpSessionEventPublisher());
}



@Override
protected void configure(HttpSecurity http) throws Exception {
    super.configure(http);
    http
    .logout()
    .logoutRequestMatcher(new AntPathRequestMatcher("/sso/logout")) 
    .and()
    .authorizeRequests()
    .antMatchers("/Portal/**").hasRole("App_Access")
    .anyRequest().permitAll()                
    .and()
    .headers().frameOptions().sameOrigin()
    ;
  }
}

1 个答案:

答案 0 :(得分:0)

问题是,即使您延长该时间,在更长的时间段后仍然会遇到问题。

如果您创建的每个ajax请求都可以通过“自动刷新/重新加载”页面对那些401进行本机响应,那么您可以选择吗?如果您的令牌仍然可以刷新,则适配器的反向通道请求会向auth服务器自动刷新令牌(在页面刷新之后);并且如果由于您超过了刷新令牌的有效期限而无法刷新令牌,则您的应用程序将重定向到@auth服务器用户登录页面。

这对您有帮助吗?在这种情况下,您可能需要略微修改页面,以便在401 ajax请求之后重新加载页面之后,然后在页面重新加载后“失败的请求”会自动重复自身(仅这次access_token将被刷新或完全过期) 。

如果一切正常,最终用户将不会注意到页面重新加载,并且一切都会照常运行,或者将其重定向到凭据输入页面。

希望有帮助

编辑:

关于“令牌的最短生存时间”和其他令牌配置选项,您是否直接在keycloak管理页面上直接尝试了@ Realm-> settings-> Token?

我相信这另一个问题与您有关,并提供了一种类似的解决方案:Spring Security + Keycloak - How to handle Ajax Requests in conjunction with "Access Token Lifespan"