密钥斗篷:在 AJAX 调用过期后刷新访问令牌



我在这里和这里都面临着同样的问题,但他们没有得到回答,我有更多的信息和不同的设置,所以它没有重复。

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

文档声明如下:

令牌

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

文档在这里

我已经更改了 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()
;
}
}

问题是,即使你延长了那个时间,你仍然会在更长的时间段后面临这个问题。

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

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

如果一切按预期工作,最终用户将不会注意到页面重新加载,并且一切将照常工作,或者他将被重定向到凭据输入页面。

希望对你有帮助

编辑:

至于"令牌最短生存时间"和其他令牌配置选项,您是否直接在KeyCloak管理页面上直接尝试了@Realm->设置->令牌?

我相信另一个问题与你的问题有关,并提供了一种类似的解决方案: Spring Security + Keycloak - 如何结合"访问令牌生命周期"处理Ajax请求

最新更新