带有 OIDC/Oauth2 刷新令牌且 max-reuse=0 的 Spring Cloud Gateway

问题描述 投票:0回答:1

我正在尝试使用 Spring Cloud Gateway 和授权代码流配置 Api 网关。 授权服务器配置为允许刷新令牌来更新访问令牌,但我们不允许处理刷新令牌的重用。一旦创建了新的访问令牌,就会附加一个新的刷新令牌,并且先前的刷新令牌将被撤销。

只要我们的网络客户端以适度的速度发送请求,这种方法就可以正常工作,但我认为在更新当前访问令牌时我们遇到了竞争情况: 如果浏览器同时发出两个或多个请求,则请求 1 将触发授权服务器的刷新。在请求 1 完成之前,请求 2 到达网关并且也会触发刷新操作。 对身份验证服务器的第一个请求将正常完成,但第二个请求将失败,因为刷新令牌已被撤销。

是否有任何配置可以处理此设置?

一个可能的解决方案可能是为刷新请求创建一个基于会话的锁,但这似乎是一个不平凡的替代方案?

openid-connect api-gateway spring-cloud-gateway
1个回答
0
投票

如果请求失败,

DefaultRefreshTokenTokenResponseClient
会抛出
OAuth2AuthorizationException
(请参阅其来源的第
105
行)。

也许,一个选项是吞掉这个异常并返回 null?

static class SwallowingRefreshTokenTokenResponseClient implements OAuth2AccessTokenResponseClient<OAuth2RefreshTokenGrantRequest> {
    private final DefaultRefreshTokenTokenResponseClient delegate = new DefaultRefreshTokenTokenResponseClient();

    @Override
    public OAuth2AccessTokenResponse getTokenResponse(OAuth2RefreshTokenGrantRequest authorizationGrantRequest) {
        try {
            return delegate.getTokenResponse(authorizationGrantRequest);
        } catch (OAuth2AuthorizationException e) {
            return null;
        }
    }
}

要切换到此类备用刷新令牌客户端,只需按照手动说明

操作即可
© www.soinside.com 2019 - 2024. All rights reserved.