Spring Security OAuth2 Stale访问令牌

pn9klfpd  于 2023-08-02  发布在  Spring
关注(0)|答案(1)|浏览(161)

我目前有一个使用Spring Security作为OAuth2客户端运行的应用程序。用户可以使用OAuth2提供程序(可以工作)登录,此时Spring Security获取授权代码并将其交换为访问令牌。可以通过以下方式访问此令牌:

Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
OAuth2AuthorizedClient client = oAuth2AuthorizedClientService.loadAuthorizedClient(oAuth2RegistrationName, authentication.getName());
OAuth2AccessToken token = client.getAccessToken();

字符串
此令牌当前用于使用资源服务器访问受保护的资源。然而,我遇到的一个问题是,我的应用程序保留访问令牌的时间太长,直到它们变得过时,资源请求开始失败。例如,一旦用户进行了身份验证,OAuth2AccessToken token = client.getAccessToken()将永远返回相同的令牌(直到应用程序重新启动)。

如何摆脱访问令牌并强制用户使用OAuth2流重新登录?我的OAuth2/OIDC身份提供者不支持刷新令牌,所以我需要强制用户重新登录。

gpnt7bae

gpnt7bae1#

我觉得你应该创建一个自定义过滤器来检查token是否过期
你能试试这个方法吗?如果有用的话,给予我一个反馈

@Component
public class Expired implements Filter {
  
  private final OAuth2ClientContext oAuth2ClientContext;

  public Expired(OAuth2ClientContext oAuth2ClientContext) {
    this.oAuth2ClientContext = oAuth2ClientContext;
  }

  @Override
  public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
      throws IOException, ServletException {
    OAuth2AccessToken accessToken = oAuth2ClientContext.getAccessToken();
    if (accessToken != null && accessToken.isExpired()) {
      HttpServletResponse httpServletResponse = (HttpServletResponse) response;
      response.sendError(401);
    }
    chain.doFilter(request, response);
  }
}

字符串

**UPDATE:**不返回401代码,可以强制返回登录页面。大概是这样的:

if (accessToken != null && accessToken.isExpired()) {
    HttpServletResponse httpResponse = (HttpServletResponse) response;
    httpResponse.sendRedirect("loginPage");


}

相关问题