Spring security 如何在OAUTH 2.0中设置expire_?

Spring security 如何在OAUTH 2.0中设置expire_?,spring-security,oauth-2.0,Spring Security,Oauth 2.0,我正在使用带有spring的OAuth 2.0生成令牌,我想在中手动设置expire\u,以便令牌可以根据我的标准过期。有人帮我吗 以下是我的回应: { access_token: "c7a6cb95-1506-40e7-87d1-ddef0a239f64" token_type: "bearer" expires_in: 43199 scope: "read" } 公共接口OAuth2AccessToken{ 公共静态字符串承载\u TYPE=“承载”; 公共

我正在使用带有spring的
OAuth 2.0
生成令牌,我想在
中手动设置
expire\u,以便令牌可以根据我的标准过期。有人帮我吗

以下是我的回应:

{
    access_token: "c7a6cb95-1506-40e7-87d1-ddef0a239f64"
    token_type: "bearer"
    expires_in: 43199
    scope: "read"
}
公共接口OAuth2AccessToken{
公共静态字符串承载\u TYPE=“承载”;
公共静态字符串OAUTH2_TYPE=“OAUTH2”;
/**
*授权服务器颁发的访问令牌。此值是必需的。
*/
公共静态字符串访问\u令牌=“访问\u令牌”;
/**
*如中所述发出的令牌类型。值不区分大小写。
*此值是必需的。
*/
公共静态字符串TOKEN\u TYPE=“TOKEN\u TYPE”;
/**
*访问令牌的生存期(以秒为单位)。例如,值“3600”表示访问令牌将
*在生成响应后一小时内过期。此值为可选值。
*/
公共静态字符串EXPIRES\u IN=“EXPIRES\u IN”;
/**
*刷新令牌,可用于使用与所述相同的授权授予获取新的访问令牌
*在中。此值是可选的。
*/
公共静态字符串REFRESH\u TOKEN=“REFRESH\u TOKEN”;
/**
*所述的访问令牌的范围
*/
公共静态字符串SCOPE=“SCOPE”;
/**
*令牌序列化程序使用additionalInformation映射导出OAuth扩展使用的任何字段。
*@返回从序列化标记中的字段名到要导出的值的映射。默认序列化程序
*使用Jackson的Java对象自动JSON映射(用于令牌端点流)或隐式调用
*.toString()作为序列化过程的一部分在“value”对象(对于隐式流)上。
*/
Map getAdditionalInformation();
设置getScope();
OAuth2RefreshToken getRefreshToken();
字符串getTokenType();
布尔isExpired();
日期getExpiration();
int getExpiresIn();
字符串getValue();
}

配置oauth配置更改Bean TokenServices并设置accessTokenValiditySeconds属性:


  • 创建AuthorizationCodeAccessTokenProvider的自定义类并重写父类

    public method obtainAccessToken(OAuth2ProtectedResourceDetails details, AccessTokenRequest request)
    
  • 在自定义类的重写方法中,调用其父类的程序逻辑:

    DefaultOAuth2AccessToken token = super.obtainAccessToken(details, request);
    
  • 这将返回一个AccessToken。 现在,您只需通过提供来自过去的时间戳,直接操作该令牌的过期值
    token.setExpiresIn(int时间戳)


可以使用从
ClientDetailsServiceConfigurer
获取的
ClientBuilder
设置它

@配置
@EnableAuthorizationServer
公共类OAuth2Config扩展了AuthorizationServerConfigurerAdapter{
@凌驾
公共无效配置(ClientDetailsServiceConfigurer客户端)引发异常{
clients.inMemory()
.与客户(“客户”)
.秘密(“秘密”)
.authorizedGrantTypes(“授权码”、“刷新令牌”、“密码”)
.范围(“应用程序”)
.accessTokenValiditySeconds(30);
}
//…附加配置
}
或者直接在
DefaultTokenServices
上,具体取决于您的需要

@配置
@EnableAuthorizationServer
公共类OAuth2Config扩展了AuthorizationServerConfigurerAdapter{
@凌驾
public void configure(AuthorizationServerEndpointsConfigurer端点)引发异常{
//在这里,您可以选择只获取端点。getConsumerTokenService()
//并强制转换为DefaultTokenServices,只需设置所需的值
DefaultTokenServices tokenServices=新的DefaultTokenServices();
setTokenStore(endpoints.getTokenStore());
tokenServices.setSupportRefreshToken(true);
setClientDetailsService(endpoints.getClientDetailsService());
setTokenEnhancer(endpoints.getTokenEnhancer());
tokenServices.setAccessTokenValiditySeconds(60);
令牌服务(令牌服务);
}
}

如果您使用的是grails安全oauth2提供程序 您只能更改grails app/conf/spring/resources.groovy

import org.springframework.security.oauth2.provider.token.DefaultTokenServices

// Place your Spring DSL code here    

beans = {

  tokenServices(DefaultTokenServices){
    accessTokenValiditySeconds =  600;
    tokenStore = ref('tokenStore')
    supportRefreshToken = true;
    clientDetailsService = ref('clientDetailsService')
  }

}

您还可以在中配置
DefaultTokenServices

安全性:
oauth2:
客户:
客户端id:客户端id
客户机密:客户机密
授权授予类型:授权\代码、刷新\令牌、密码
范围:openid
访问令牌有效时间:30秒

也在寻找这个答案,并尝试了DeezCashews提出的解决方案。但它对我不起作用,因为有一部分代码首先检查这个值是否设置在列access\u token\u validity table oauth\u client\u details中,然后才检查来自tokenServices的greps值。所以,如果在oauth_client_details表中设置了“expires_in”,则需要在那里进行更改

检查数据库中有效性属性的代码:

    protected int getAccessTokenValiditySeconds(OAuth2Request clientAuth) {
    if (clientDetailsService != null) {
        ClientDetails client = clientDetailsService.loadClientByClientId(clientAuth.getClientId());
        Integer validity = client.getAccessTokenValiditySeconds();
        if (validity != null) {
            return validity;
        }
    }
    return accessTokenValiditySeconds;
}

因此,我认为没有任何政策可以这样做。但是有一种方法可以导致成功。 只需使用刷新令牌API即可使当前访问令牌无效:D
很简单。

security.oauth2.client.access-token-validity-seconds=30
    protected int getAccessTokenValiditySeconds(OAuth2Request clientAuth) {
    if (clientDetailsService != null) {
        ClientDetails client = clientDetailsService.loadClientByClientId(clientAuth.getClientId());
        Integer validity = client.getAccessTokenValiditySeconds();
        if (validity != null) {
            return validity;
        }
    }
    return accessTokenValiditySeconds;
}