gpt4 book ai didi

java - Spring 安全 Oauth2 : Flow to Handling Expired AccessToken

转载 作者:搜寻专家 更新时间:2023-10-31 20:27:52 26 4
gpt4 key购买 nike

我只是 Spring Security Oauth2 的初学者。我尝试制作授权服务器和资源服务器(分开并连接到 JDBC),目的是进行单点登录。我的流程成功从授权服务器获取访问 token 和刷新 token 。我的accesstoken一直作为访问Resouce Server的参数,这是给一个响应。

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

我的问题,如果 accesstoken 过期,spring security 将阻止访问页面并给出错误异常。我什么时候必须使用 refreshtoken 来获取新 token ?还是我的流程不对?是否有其他流程更新accesstoken?

谢谢

已编辑:

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

我还可以使用授权服务器提供的 refreshToken 请求新的 accessToken。但是我不能调用这个过程,因为如果我访问 url 映射,之前 spring security 会阻止访问并返回无效 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"
}

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

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 端点)。

顺便说一句,对于 SSO,您通常不需要资源服务器。但这是一个不同的问题。

关于java - Spring 安全 Oauth2 : Flow to Handling Expired AccessToken,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27392999/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com