2017-07-28 3 views
2

私は春のセキュリティとのOAuth2を実装しようと、私は次のGithubに春が提供するサンプル検討してきた: https://github.com/spring-projects/spring-security-oauth/blob/master/samples/oauth2/tonr/src/main/java/org/springframework/security/oauth/examples/config/WebMvcConfig.java傷:いくつかのプロバイダのために使用したのと同じOAuth2ClientContext

をこれのOAuth2のサンプルが分割されます二つのプロジェクト:のOAuth2クライアント(OAuth2Client)と

  • sparklr::のOAuth2プロバイダ(ResourceServer TONR

    • AuthorizationServer)

    TonrはSparklrの写真を表示でき、アカウントの友人を一覧表示するFacebook APIクライアントも含まれています。 一度プロバイダから取得した場合、トークンが被呼プロバイダから来ていない場合でも、すべてのOAuth2プロバイダに同じトークンが送信されるようです。

    ステップ:

    • 私はtonr2にログイン(ローカルホスト:8080/tonr2/login.jspに)
    • 私は(ローカルホストSparklrの写真に移動し、sparklr2てログイン:8080/tonr2/sparklr /写真&ローカルホスト:8080/sparklr2/login.jspに)
    • 私はスコープリードを承認し、私は写真を参照してください。そして、私はFacebookの友達のページに移動し、[OK]
    • を:localhostを:8080/tonr2/Facebookの/情報

    sparklrトークンがFacebookに送信され(デバッグログに表示されます)、明らかにFacebookは400 Bad Request Errorを返します。

    今のところ私はtonrからログアウトし、Facebookの友達ページに直接クリックしてもう一度ログインしてください。トークンはFacebookに尋ねられ、アクセスが許可されます。 同じOAuth2ClientContextと同じトークンがSparklrからFacebookに保存されます。

    質問:そのそれぞれのリソースサーバとのトークンを維持するためにOAuth2ClientContextを分離する方法

    私はfacebookRestTemplateに異なるOAuth2ClientContext Beanをインスタンス化しようとしましたが、のOAuth2フローがで壊れている:

    @Bean(name = "facebookClientContext") 
    public OAuth2ClientContext facebookClientContext() { 
        return new DefaultOAuth2ClientContext(); 
    } 
    
    @Bean 
    public OAuth2RestTemplate facebookRestTemplate(@Qualifier("facebookClientContext") OAuth2ClientContext clientContext) { 
        ... 
    
  • 答えて

    1

    私は同じ問題を抱えていました。

    1. DefaultOAuth2ClientContextのコンストラクタにAccessTokenRequest(リクエストスコープ)を挿入する必要があることを除いて、同じことを解決しました。 AccessTokenRequestはMapであるため、Springのこのバージョンでは@Resource注入が必要です。
    2. session-scope facebookClientContextは、異なるユーザー間でトークンを共有しません。

    OAuth2ClientConfigurationのガイドラインを参照してください。

    あなたWebMvcConfig $ ResourceConfigurationを変更します。

    @Resource(name = "accessTokenRequest") 
        private AccessTokenRequest accessTokenRequest; 
    
        @Bean 
        @Qualifier("facebookClientContext") 
        @Scope(value = "session", proxyMode = ScopedProxyMode.INTERFACES) 
        public DefaultOAuth2ClientContext facebookClientContext() { 
         return new DefaultOAuth2ClientContext(accessTokenRequest); 
        } 
    
        @Bean 
        public OAuth2RestTemplate facebookRestTemplate(
          @Qualifier("facebookClientContext") OAuth2ClientContext clientContext) { 
         OAuth2RestTemplate template = new OAuth2RestTemplate(facebook(), clientContext); 
         MappingJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter(); 
         converter.setSupportedMediaTypes(
           Arrays.asList(MediaType.APPLICATION_JSON, MediaType.valueOf("text/javascript"))); 
         template.setMessageConverters(Arrays.<HttpMessageConverter<?>>asList(converter)); 
         return template; 
        } 
    
        @Bean 
        public OAuth2RestTemplate sparklrRestTemplate(
          @Qualifier("oauth2ClientContext") OAuth2ClientContext clientContext) { 
         return new OAuth2RestTemplate(sparklr(), clientContext); 
        } 
    
        @Bean 
        public OAuth2RestTemplate sparklrRedirectRestTemplate(
          @Qualifier("oauth2ClientContext") OAuth2ClientContext clientContext) { 
         return new OAuth2RestTemplate(sparklrRedirect(), clientContext); 
        } 
    
    関連する問題