我正在尝试使用 Spring Cloud Gateway 和授权代码流配置 Api 网关。 授权服务器配置为允许刷新令牌来更新访问令牌,但我们不允许处理刷新令牌的重用。一旦创建了新的访问令牌,就会附加一个新的刷新令牌,并且先前的刷新令牌将被撤销。
只要我们的网络客户端以适度的速度发送请求,这种方法就可以正常工作,但我认为在更新当前访问令牌时我们遇到了竞争情况: 如果浏览器同时发出两个或多个请求,则请求 1 将触发授权服务器的刷新。在请求 1 完成之前,请求 2 到达网关并且也会触发刷新操作。 对身份验证服务器的第一个请求将正常完成,但第二个请求将失败,因为刷新令牌已被撤销。
是否有任何配置可以处理此设置?
一个可能的解决方案可能是为刷新请求创建一个基于会话的锁,但这似乎是一个不平凡的替代方案?
如果请求失败,
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;
}
}
}
要切换到此类备用刷新令牌客户端,只需按照手动说明
操作即可