【发布时间】:2017-04-13 10:59:57
【问题描述】:
我目前正在开发用于 Oauth2 身份验证的 spring 应用程序,但在实现自定义 ClientDetailsService 时遇到了一些问题。
我无法使用常见的 inMemory 或 jdbc clientDetailsService,因为客户端信息没有存储在我的应用程序中,我从外部 Web 服务获取它们。但是,当我设置自定义 ClientDetailService 时,我不再获得 access_confirmation 页面(我得到一个空白页面)。
为了向您展示我的问题,我不使用我的应用程序,而是使用官方 spring--security-oauth 项目 spring-security-oauth 的 vanilla 测试
这是应用程序代码:
@SpringBootApplication
@EnableResourceServer
@RestController
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
@RequestMapping("/")
public String home() {
return "Hello World";
}
@RequestMapping(value = "/", method = RequestMethod.POST)
@ResponseStatus(HttpStatus.CREATED)
public String create(@RequestBody MultiValueMap<String, String> map) {
return "OK";
}
@Configuration
@EnableAuthorizationServer
protected static class OAuth2Config extends AuthorizationServerConfigurerAdapter {
@Autowired
private AuthenticationManager authenticationManager;
@Override
public void configure(AuthorizationServerEndpointsConfigurer endpoints) throws Exception {
endpoints.authenticationManager(authenticationManager);
}
@Override
public void configure(AuthorizationServerSecurityConfigurer security) throws Exception {
security.checkTokenAccess("isAuthenticated()");
}
public ClientDetailsService clientDetailsService() {
return new ClientDetailsService() {
@Override
public ClientDetails loadClientByClientId(String clientId) throws ClientRegistrationException {
BaseClientDetails details = new BaseClientDetails();
details.setClientId(clientId);
details.setAuthorizedGrantTypes(Arrays.asList("authorization_code") );
details.setScope(Arrays.asList("read, trust"));
details.setResourceIds(Arrays.asList("oauth2-resource"));
Set<GrantedAuthority> authorities = new HashSet<GrantedAuthority>();
authorities.add(new SimpleGrantedAuthority("ROLE_CLIENT"));
details.setAuthorities(authorities);
return details;
}
};
} //*/
@Override
public void configure(ClientDetailsServiceConfigurer clients) throws Exception {
// @formatter:off
clients.withClientDetails(clientDetailsService());
/*clients.inMemory()
.withClient("test")
.authorizedGrantTypes("authorization_code")
.authorities("ROLE_CLIENT")
.scopes("read", "trust")
.resourceIds("oauth2-resource");
//*/
// @formatter:on
}
}
}
如您所见,我添加了我的自定义 clientDetailsService 并更改了 ClientDetailsServiceconfigurer 配置以设置它而不是内存中的 clientDetailsService。
我的问题是,当我尝试获取我的令牌时,我在登录用户后不再获得我的 access_confirmation 页面。
我发现了我的问题,我在 clientDetails 中对范围的定义是错误的。我有 Arrays.asList("read, trust") 而不是 Arrays.asList("read", "trust")
我错过了什么吗?我必须在其他地方设置我的自定义 clientDetailsService 吗?
【问题讨论】:
-
您是否有其他信息(如堆栈跟踪或日志)可以显示有关您的问题的更多信息?
-
我的测试没有任何错误。如果我尝试使用邮递员设置获取令牌 - localhost:8080/oauth/authorize 作为授权 url - localhost:8080/oauth/token 作为令牌 url - 测试作为客户端 id - authentication_code 作为授权类型我在用户之后得到一个空屏幕身份验证(他没有进入 confirm_access 页面)
-
如果我在我的浏览器上用这个 url 测试它:localhost:8080/oauth/… 我被重定向到 redirect-uri 而没有获得 confirm_access 页面(对于浏览器 url,我知道 url 不正确获取我的令牌,但它应该足以测试授权)
-
如果您在 ClientDetails 中定义重定向 uri,如 details.setRegisteredRedirectUri(...) 会怎样?
-
我试过了,但它没有改变,registeredRedirectUris 没有在正在工作的 inMemory clientDetailsService 定义中定义
标签: spring spring-security oauth spring-security-oauth2 oauth2