Spring security 如何在OAUTH 2.0中设置expire_?
我正在使用带有spring的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=“承载”; 公共
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;
}