2

私は現在、Oauth2認証用のSpringアプリケーションを開発中ですが、カスタムClientDetailsS​​erviceの実装に問題があります。スプリングセキュリティOAuth2 - カスタムClientDetailsS​​ervice

クライアント情報がアプリケーションに保存されていないため、一般的なinMemory ou jdbc clientDetailsS​​erviceは使用できません。外部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 
     } 
    } 

} 

カスタムのclientDetailsS​​erviceを追加し、ClientDetailsS​​erviceconfigurerの設定を変更して、メモリ内のclientDetailsS​​erviceの代わりに設定することができます。

私の問題は、私のトークンを取得しようとすると、私はユーザーをログアウトした後に私のaccess_confirmationページをもう取得しないということです。

私の問題が見つかりました。私のclientDetails内のスコープの定義は偽でした。 Arrays.asList( "read"、 "trust")ではなくArrays.asList( "read、trust")

私は何かを忘れましたか?カスタムのclientDetailsS​​erviceを別の場所に設定する必要がありますか?

+1

は、あなたの問題の詳細を示しているスタックトレースやログなどの追加的な情報を持っていますか? –

+0

私のテストでは何のエラーもありません。 私は郵便配達は を設定してトークンを取得しようとする場合 - ローカルホスト:8080 /にOAuth /認証URLとして認可 - ローカルホスト:8080 /にOAuth /トークンとしてトークンURL - 許可タイプとしてauthorization_code I - クライアントID としてテスト(彼はconfirm_accessのページに行っていない) –

+0

私はこのURLで私のブラウザでそれをテストする:http:// localhost:8080/oauth/authorize?client_id = test&redirect_uri = http:// localhost:8080 /&response_type = code へのconfirm_accessページを取得せずにredirect-uriにリダイレクトされました(ブラウザのURLの場合、URLが自分のトークンを取得するのは問題ではありませんが、認証をテストするにはenuoghでなければなりません) –

答えて

1

はそうのようなあなたのClientDetailsのIMPLを変更してみてください:

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; 
      } 
     }; 
    } //*/ 
+0

助けてくれてありがとう、私は自分のバグを発見しました。 Arrays.asList( "read"、 "trust")ではなくArrays.asList( "read、trust") –

+0

ニース!私は/ Pも同様に誤植に気づかなかった:) – vmarusic

関連する問題