WIP
[facebook-utils] / src / main / java / de / juplo / facebook / FacebookUtils.java
1 package de.juplo.facebook;
2
3
4 import de.juplo.facebook.token.SignedRequestAwareAuthorizationCodeAccessTokenProvider;
5 import java.util.Arrays;
6 import java.util.LinkedList;
7 import java.util.List;
8 import javax.annotation.PostConstruct;
9 import org.slf4j.Logger;
10 import org.slf4j.LoggerFactory;
11 import org.springframework.beans.BeansException;
12 import org.springframework.beans.factory.annotation.Autowired;
13 import org.springframework.beans.factory.config.BeanPostProcessor;
14 import org.springframework.context.annotation.Bean;
15 import org.springframework.context.annotation.Configuration;
16 import org.springframework.security.oauth2.client.OAuth2RestTemplate;
17 import org.springframework.security.oauth2.client.token.AccessTokenProvider;
18 import org.springframework.security.oauth2.client.token.AccessTokenProviderChain;
19 import org.springframework.security.oauth2.client.token.grant.client.ClientCredentialsAccessTokenProvider;
20 import org.springframework.security.oauth2.client.token.grant.implicit.ImplicitAccessTokenProvider;
21 import org.springframework.security.oauth2.client.token.grant.password.ResourceOwnerPasswordAccessTokenProvider;
22
23
24
25 /**
26  * This class injects the facebook-utils into the spring-oauth2-configuration
27  *
28  * @author kai
29  */
30 @Configuration
31 public class FacebookUtils
32 {
33   private final Logger log = LoggerFactory.getLogger(FacebookUtils.class);
34
35
36   @Autowired(required=false)
37   private List<AccessTokenProvider> accessTokenProviderChain;
38
39
40   @PostConstruct
41   public void init()
42   {
43     if (accessTokenProviderChain == null)
44     {
45       log.info("no AccessTokenProviderChain configured, creating default-chain");
46       accessTokenProviderChain =
47           Arrays.<AccessTokenProvider> asList(
48               new ImplicitAccessTokenProvider(),
49               new ResourceOwnerPasswordAccessTokenProvider(),
50               new ClientCredentialsAccessTokenProvider()
51               );
52     }
53   }
54
55
56   @Bean
57   public BeanPostProcessor getBeanPostProcessor(final String clientSecret)
58   {
59     log.debug("createing new instance of BeanPostProcessor");
60     return new BeanPostProcessor() {
61
62       @Override
63       public Object postProcessBeforeInitialization(
64           Object bean,
65           String beanName
66           )
67           throws
68             BeansException
69       {
70         if (bean instanceof OAuth2RestTemplate)
71         {
72           log.info("injecting signed_request-aware AccessTokenProviderChain");
73           OAuth2RestTemplate template = (OAuth2RestTemplate)bean;
74           List<AccessTokenProvider> chain =
75               new LinkedList<>(accessTokenProviderChain);
76           SignedRequestAwareAuthorizationCodeAccessTokenProvider provider =
77               new SignedRequestAwareAuthorizationCodeAccessTokenProvider();
78           provider.setSecret(clientSecret);
79           chain.add(provider);
80           template.setAccessTokenProvider(new AccessTokenProviderChain(chain));
81         }
82
83         return bean;
84       }
85
86       @Override
87       public Object postProcessAfterInitialization(
88           Object bean,
89           String beanName
90           )
91           throws
92             BeansException
93       {
94         return bean;
95       }
96     };
97   }
98 }