Spring 具有一个刷新令牌的多址令牌

Spring 具有一个刷新令牌的多址令牌,spring,spring-security,oauth-2.0,spring-security-oauth2,Spring,Spring Security,Oauth 2.0,Spring Security Oauth2,我有多个移动客户端,它们都使用密码授权流进行身份验证。为此,我只想使用一个非常持久的刷新令牌和多个寿命较短的访问令牌。我一直试图在spring中使用密码授权生成多个访问令牌,但是,每当我刷新访问令牌时,旧的访问令牌就会停止工作。我检查了数据库,oauth_access_令牌表中始终只有一条记录用于该特定身份验证。SpringOAuth2不是应该为一个刷新令牌生成多个访问令牌吗? 感谢您的帮助。OAuth2规范支持它,请参阅: 1.5。刷新令牌 刷新令牌是用于获取访问令牌的凭据。刷新 令牌由授权服

我有多个移动客户端,它们都使用密码授权流进行身份验证。为此,我只想使用一个非常持久的刷新令牌和多个寿命较短的访问令牌。我一直试图在spring中使用密码授权生成多个访问令牌,但是,每当我刷新访问令牌时,旧的访问令牌就会停止工作。我检查了数据库,oauth_access_令牌表中始终只有一条记录用于该特定身份验证。SpringOAuth2不是应该为一个刷新令牌生成多个访问令牌吗?
感谢您的帮助。

OAuth2规范支持它,请参阅:

1.5。刷新令牌

刷新令牌是用于获取访问令牌的凭据。刷新 令牌由授权服务器颁发给客户端,并且 用于在当前访问令牌失效时获取新的访问令牌 变得无效或过期,或获取其他访问令牌 具有相同或较窄的范围(访问令牌可能具有较短的 生存期和权限少于资源授权的权限 所有者)

但是Spring Security OAuth2不支持它,请参见:

//清除已与刷新关联的所有访问令牌
//代币。
tokenStore.removeAccessTokenUsingRefreshToken(refreshToken);
以及:

使用刷新令牌删除访问令牌。此功能是必需的,因此刷新令牌不能用于创建无限数量的访问令牌


一种解决方法是实现自定义的
令牌存储

这里的目标是使多个设备能够独立地使用不同的令牌。事实证明,在SpringOAuth中,我们不能有一个具有多个访问令牌的刷新令牌结果还表明,没有必要有这样的配置;只要我们可以对不同的设备进行单独的身份验证,这就足够了。现在,基于客户端id、作用域和用户名生成一个密钥(DefaultAuthenticationKeyGenerator)。由于我没有使用范围,我简单地将设备信息放在范围中,得到以下信息:

{
"access_token": "32e11a1b-cb9f-4317-95b0-e850f260d160",
"token_type": "bearer",
"refresh_token": "d097e4ea-a9d9-4e0c-94cd-7c15e1c8e690",
"expires_in": 3599,
"scope": "android2",
"exp": 1557843628674
}
要实现这一点,只需省略作用域配置,如下所示:

  public void configure(ClientDetailsServiceConfigurer configurer) throws Exception {

configurer
    .inMemory()
    .withClient(CLIENT_ID)
    .secret(passwordEncoder.encode(CLIENT_SECRET))
    .authorizedGrantTypes(GRANT_TYPE_PASSWORD, AUTHORIZATION_CODE, REFRESH_TOKEN, IMPLICIT)
    // ************* Comment this out ******
    //.scopes(SCOPE_READ, SCOPE_WRITE, TRUST)
    .accessTokenValiditySeconds(ACCESS_TOKEN_VALIDITY_SECONDS).
    refreshTokenValiditySeconds(REFRESH_TOKEN_VALIDITY_SECONDS);
    }
使用此方法,每个设备都可以获得单独的令牌。此外,当用户注销时,我们可以选择将其从所有设备中注销。
但是,我们不能在我们的请求中遗漏范围;范围参数必须始终在刷新令牌请求中发送。

回答得好。我们配置自定义令牌存储的方式是,通过刷新令牌删除时,仅删除过期的访问令牌。通过这种方式,您可以让同一用户的多个设备共享相同的刷新令牌,但每个设备都有一个单独的访问令牌。