spring security client_credentials grant_type - 支持刷新令牌

Posted

技术标签:

【中文标题】spring security client_credentials grant_type - 支持刷新令牌【英文标题】:spring security client_credentials grant_type - support for refresh token 【发布时间】:2017-11-14 11:09:33 【问题描述】:

client_credentials 授权类型是否支持刷新令牌场景?

使用client_credentials授权类型时,access_token过期应该如何处理?

我在代理服务(Zuul with EnableOAuth2Sso)后面有一个授权服务和安全服务,它充当来自客户端应用程序的所有请求的网关。

这是我的流程:

    接受来自客户端应用程序的请求 (rest api) 的代理服务 (zuul) 代理服务通过发布client_idclient_secretgrant_typeclient_credentials)调用授权服务api,并获取access_tokenrefresh_token,并从响应中过期时间 代理服务根据 zuul 路由映射将原始请求路由到受保护的服务。

此流程运行良好,但查看ClientCredentialsAccessTokenProvider 中的代码我注意到'supportsRefresh' 返回false 和'refreshToken' 方法返回null。这是否意味着当access_token 过期时,任何从客户端应用程序到代理服务(zuul)的后续请求都会失败?

【问题讨论】:

【参考方案1】:

client_credentialsOAuth 授予服务器机器对机器身份验证的需要,因此无需刷新令牌。

因此,在 Spring Security OAuth 的 ClientCredentialsAccessTokenProvider 中,supportsRefresh 返回 false,refreshToken 方法返回 null。

事实上,您的授权服务器和资源服务器都在同一个地方(这意味着令牌生成非常便宜),很像我们的设置。我建议你可以为 access token 设置一个较短的生命周期(比如 10 分钟),并把它们当作一次性的,每次你想接触受保护的资源时都可以得到 access token。

【讨论】:

感谢您的回复。很少澄清。 1) 资源服务器和身份验证服务器可能不在同一个地方 2) 在我们的场景中,它不是获取 access_token 的资源服务器。我们有一个网关服务 (zuul),它负责从身份验证服务器获取 access_token,并将其在 http 标头中中继到资源服务器。我的问题是我们的代理服务器是否应该总是为每个请求获取一个新的 access_token 或者是否只能在它过期时刷新?我希望稍后再看 ClientCredentialsAccessTokenProvider 类,我发现它不受支持。 我正在考虑的另一个选择是在我们的网关服务中实现逻辑(过滤器),以检查上下文中的 access_token 是否过期,然后使用客户端凭据(client_id 和 client_secret)获取新的 access_token。跨度> @rgv,是的,您应该AuthenticationFilter 来执行这些与令牌相关的操作。

以上是关于spring security client_credentials grant_type - 支持刷新令牌的主要内容,如果未能解决你的问题,请参考以下文章

Spring Security:2.4 Getting Spring Security

没有 JSP 的 Spring Security /j_spring_security_check

Spring-Security

Spring Security 登录错误:HTTP 状态 404 - /j_spring_security_check

未调用 Spring Security j_spring_security_check

Spring Security入门(3-7)Spring Security处理页面的ajax请求