当前位置: 首页 > 知识库问答 >
问题:

KeyClope:ajax调用过期后刷新访问令牌

梅飞宇
2023-03-14

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

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

文件说明如下:

令牌最短生存时间在密钥斗篷服务器过期之前,用密钥斗篷服务器抢先刷新活动访问令牌的时间量,以秒为单位。当访问令牌被发送到另一个REST客户机时,这一点尤其有用,因为它可能会在评估之前过期。此值不应超过域的访问令牌寿命。这是可选的。默认值为0秒,所以只要访问令牌过期,适配器就会刷新它。

文档在这里

我已经更改了KeyClope中令牌最短生存时间的默认值。但是我不工作。

{
"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 Security适配器配置中遗漏了一些东西:

@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个答案

闻人景澄
2023-03-14

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

如果您创建的每一个ajax请求都通过“自动刷新/重新加载”页面以本机方式对这些401请求做出反应,您会选择这样做吗?如果您的令牌仍然可以刷新,它将由适配器向auth服务器的反向通道请求自动刷新(页面刷新后);如果由于您超过了刷新令牌的有效期而无法刷新令牌,那么您的应用程序将被重定向到@auth server user login页面。

这对你有帮助吗?在这种情况下,您可能需要稍微修改页面,以便在401 ajax请求后重新加载页面后,该“失败的请求”会在页面重新加载后自动重复(只有这一次,access_令牌才会刷新或完全过期)。

如果一切正常,最终用户要么不会注意到页面重新加载,一切正常,要么会被重定向到凭证输入页面。

希望有帮助

编辑:

至于“令牌最短生存时间”和其他令牌配置选项,您是否直接尝试了@Realm-

我相信这个问题和你的有关

 类似资料:
  • 我有一个基于web的应用程序,使用谷歌OAuth2.0作为登录框架。它以前一直工作得很好,直到昨天。访问令牌过期后,applcation无法获取刷新令牌。除此之外,“请求许可”页面已经改为“有离线访问”,而不是“知道你在谷歌上是谁”和“查看你的电子邮件”。 我试图寻找类似的问题,但我找不到一个。这是从昨天开始发生的。在此之前,我从来没有对代码做过任何改变。

  • 当我试图在访问令牌过期之前使用刷新令牌生成访问令牌时,系统会生成一个新令牌,并且一切正常。但是如果访问令牌过期,则请求返回。 中的方法不是使用我从以前的访问令牌中存储在字典中的标识生成访问令牌吗? 如果上一个更新令牌尚未过期,如何阻止客户端使用相同的刷新令牌请求新的访问令牌? oauthProvider.cs: RefreshTokenProvider.cs: 对不起,英语不好,希望你能理解!

  • 本文向大家介绍oauth 刷新访问令牌,包括了oauth 刷新访问令牌的使用技巧和注意事项,需要的朋友参考一下 示例 资源

  • 若授权服务器给客户端颁发了刷新令牌,客户端通过使用按附录B“application/x-www-form-urlencoded”格式在HTTP请求实体正文中发送下列UTF-8字符编码的参数向令牌端点发起刷新请求: grant_type 必需的。值必须设置为“refresh_token”。 refresh_token 必需的。颁发给客户端的刷新令牌。 scope 可选的。如3.3节所述的访问请求的范

  • 我在我的应用程序中使用Google API,并且oAuth2刷新令牌在1小时后过期。我正在使用此刷新令牌执行每天运行的任务。我使用OAuth2游乐场创建刷新令牌。有没有办法延长刷新令牌的过期时间?(1个月)