現在、Oauth2認証用のSpringアプリに取り組んでいますが、カスタムClientDetailsServiceの実装で問題が発生しました。
クライアント情報がアプリに保存されていないため、一般的なinMemoryまたはjdbc clientDetailsServiceを使用できません。外部のWebサービスから取得します。しかし、カスタムClientDetailServiceを設定すると、access_confirmationページが表示されなくなります(空白のページが表示されます)。
私の問題を示すために、私は自分のアプリを使用していませんが、公式の春のバニラテストを使用しています--security-oauthプロジェクト spring-security-oauth
アプリケーションコードは次のとおりです。
@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を別の場所に設定する必要がありますか?
次のようにClientDetailsimplを変更してみてください。
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.setRegisteredRedirectUri(Collections.singleton("http://anywhere.com"));
details.setResourceIds(Arrays.asList("oauth2-resource"));
Set<GrantedAuthority> authorities = new HashSet<GrantedAuthority>();
authorities.add(new SimpleGrantedAuthority("ROLE_CLIENT"));
details.setAuthorities(authorities);
return details;
}
};
} //*/