私は現在、Oauth2認証用のSpringアプリケーションを開発中ですが、カスタムClientDetailsServiceの実装に問題があります。スプリングセキュリティOAuth2 - カスタムClientDetailsService
クライアント情報がアプリケーションに保存されていないため、一般的なinMemory ou jdbc clientDetailsServiceは使用できません。外部Webサービスから取得します。しかし、カスタムClientDetailServiceを設定すると、私はもうaccess_confirmationページを取得しません(空白のページが表示されます)。
は、私は私のアプリを使用していないあなたに私の問題を表示するが、公式の春からバニラテスト - セキュリティの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を別の場所に設定する必要がありますか?
は、あなたの問題の詳細を示しているスタックトレースやログなどの追加的な情報を持っていますか? –
私のテストでは何のエラーもありません。 私は郵便配達は を設定してトークンを取得しようとする場合 - ローカルホスト:8080 /にOAuth /認証URLとして認可 - ローカルホスト:8080 /にOAuth /トークンとしてトークンURL - 許可タイプとしてauthorization_code I - クライアントID としてテスト(彼はconfirm_accessのページに行っていない) –
私はこのURLで私のブラウザでそれをテストする:http:// localhost:8080/oauth/authorize?client_id = test&redirect_uri = http:// localhost:8080 /&response_type = code へのconfirm_accessページを取得せずにredirect-uriにリダイレクトされました(ブラウザのURLの場合、URLが自分のトークンを取得するのは問題ではありませんが、認証をテストするにはenuoghでなければなりません) –