H5W3
当前位置:H5W3 > java > 正文

【java】Spring Security Oauth2 : Flow to Handling Expired AccessToken

我只是Spring Security Oauth2的初学者。
我尝试制作Authorization Server和Resource Server(分离并连接到JDBC),目的是制作Single Sign-On。
我的流程成功从授权服务器获取accesstoken和refreshtoken。我的accesstoken始终用作访问Resouce Server的参数,这是一个响应。

for example http://127.0.0.1:8080/Resource/res/staff?access_token=xxxxxxxxxxxxxxxxxxxxx

我的问题是,如果accesstoken过期,Spring安全性将阻止访问该页面并给出错误异常。什么时候必须使用refreshtoken获取新 token ?
还是我的流程错了?还有其他流程来续订访问 token 吗?

谢谢

编辑:

供引用:
我想使用Spring Security Oauth2进行SSO。我有几台Apps Server(使用Spring Framework),我想做一台负责管理登录的服务器。我想使Apps Server成为资源服务器(也是客户端)
因此,我使用Spring Security Oauth2制作了一个授权服务器。想要访问 protected 资源服务器的用户必须登录到授权服务器(资源服务器授权到授权服务器)。它将获得一个代码,然后资源服务器将使用accessToken和refreshToken交换此代码。这个流程是成功的。

我还可以使用授权服务器提供的refreshToken请求新的accessToken。
但是我无法调用此过程,因为如果我访问url映射,以前的 Spring 安全性会阻止访问并提供无效的 token 错误返回。

如何解决缺少的链接?

更新:

这是我的授权服务器配置:

@Configuration
public class Oauth2AuthorizationServer {
@Configuration
@EnableAuthorizationServer
protected static class AuthorizationServerConfiguration extends
AuthorizationServerConfigurerAdapter {
@Autowired
@Qualifier("authenticationManagerBean")
private AuthenticationManager authenticationManager;
@Autowired
DataSource dataSource;
@Override
public void configure(AuthorizationServerEndpointsConfigurer endpoints)
throws Exception {
endpoints
.tokenStore(new JdbcTokenStore(dataSource))
.authenticationManager(authenticationManager);
}
@Override
public void configure(AuthorizationServerSecurityConfigurer oauthServer) throws Exception {
oauthServer.tokenKeyAccess("isAnonymous() || permitAll()").checkTokenAccess("permitAll()");
}
@Override
public void configure(ClientDetailsServiceConfigurer clients) throws Exception {
clients
.jdbc(dataSource);
}
}
}

这是我的资源服务器配置(也是客户端)

@Configuration
public class Oauth2ResourceServer {
private static final String RESOURCE_ID = "test";
@Configuration @Order(10)
protected static class NonOauthResources extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http.authorizeRequests()
.antMatchers("/api/halo").permitAll()
.antMatchers("/api/state/**").permitAll()
.antMatchers("/**").permitAll()
.and().anonymous();
}
}
@Configuration
@EnableResourceServer
protected static class ResourceServerConfiguration extends
ResourceServerConfigurerAdapter {
@Override
public void configure(ResourceServerSecurityConfigurer resources) {
RemoteTokenServices tokenService = new RemoteTokenServices();
tokenService.setClientId("jsclient");
tokenService.setClientSecret("jspasswd");
tokenService.setCheckTokenEndpointUrl("http://localhost:8084/Server2Auth/oauth/check_token");
resources
.resourceId(RESOURCE_ID)
.tokenServices(tokenService);
}
@Override
public void configure(HttpSecurity http) throws Exception {
http.authorizeRequests()
.filterSecurityInterceptorOncePerRequest(true)
.antMatchers("/res/staff").hasRole("STAFF")
.antMatchers("/res/client").access("#oauth2.hasScope('trust')")
.antMatchers("/res/admin").hasRole("ADMIN")
.and()
.exceptionHandling().accessDeniedPage("/403");
}
}
}

资源(也是客户)要求授权:

curl -X POST -vu clientauthcode:123456 http://localhost:10000/auth-server/oauth/token -d "client_id=clientauthcode&grant_type=refresh_token&refresh_token=436761f1-2f26-412b-ab0f-bbf2cd7459c4"

来自授权服务器的反馈:

http://localhost:10001/resource-server/api/state/new?code=8OppiR

资源(作为客户端)将代码交换给授权服务器:

curl -X POST -vu clientauthcode:123456 http://localhost:10000/auth-server/oauth/token -H "Accept: application/json" -d "grant_type=authorization_code&code=iMAtdP&redirect_uri=http://localhost:10001/resource-server/api/state/new"

来自授权服务器的反馈:

{
"access_token":"08664d93-41e3-473c-b5d2-f2b30afe7053",
"token_type":"bearer",
"refresh_token":"436761f1-2f26-412b-ab0f-bbf2cd7459c4",
"expires_in":43199,
"scope":"write read"
}

资源(作为客户端)访问网址本身

curl http://localhost:10001/resource-server/api/admin?access_token=08664d93-41e3-473c-b5d2-f2b30afe7053

使用刷新 token 请求新的访问 token

curl -X POST -vu clientauthcode:123456 http://localhost:10000/auth-server/oauth/token -d "client_id=clientauthcode&grant_type=refresh_token&refresh_token=436761f1-2f26-412b-ab0f-bbf2cd7459c4"

最佳答案

The OAuth2 Spec包含刷新访问 token 的部分。它在Spring OAuth中以非常标准的方式实现(您只需将刷新 token 发布到/token端点即可)。

BTW for SSO,您通常不需要资源服务器。但这是一个不同的问题。

本文地址:H5W3 » 【java】Spring Security Oauth2 : Flow to Handling Expired AccessToken

评论 0

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址