1 package de.juplo.facebook;
4 import java.util.Arrays;
5 import java.util.LinkedList;
7 import javax.annotation.PostConstruct;
8 import org.codehaus.jackson.map.ObjectMapper;
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.http.converter.HttpMessageConverter;
17 import org.springframework.http.converter.json.MappingJacksonHttpMessageConverter;
18 import org.springframework.security.oauth2.client.OAuth2RestTemplate;
19 import org.springframework.security.oauth2.client.token.AccessTokenProvider;
20 import org.springframework.security.oauth2.client.token.AccessTokenProviderChain;
21 import org.springframework.security.oauth2.client.token.grant.client.ClientCredentialsAccessTokenProvider;
22 import org.springframework.security.oauth2.client.token.grant.implicit.ImplicitAccessTokenProvider;
23 import org.springframework.security.oauth2.client.token.grant.password.ResourceOwnerPasswordAccessTokenProvider;
24 import org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter;
29 * This class injects the facebook-utils into the spring-oauth2-configuration
34 public class FacebookUtils
36 private final Logger log = LoggerFactory.getLogger(FacebookUtils.class);
39 @Autowired(required=false)
40 private List<AccessTokenProvider> accessTokenProviderChain;
42 * Needed, to extract Jackson-ObjectMapper.
43 * Defined by <mvc:annotation-driven />
46 private RequestMappingHandlerAdapter requestMappingHandlerAdapter;
48 private ObjectMapper objectMapper;
54 for (HttpMessageConverter<?> messageConverter : requestMappingHandlerAdapter.getMessageConverters())
56 if (messageConverter instanceof MappingJacksonHttpMessageConverter)
58 MappingJacksonHttpMessageConverter m =
59 (MappingJacksonHttpMessageConverter)messageConverter;
60 objectMapper = m.getObjectMapper();
62 "found ObjectMapper {} ({})",
64 objectMapper.getClass().getCanonicalName()
69 if (objectMapper == null)
71 throw new RuntimeException(
72 "Unable to find MappingJAcksonHttpMessageConverter!"
76 if (accessTokenProviderChain == null)
78 log.info("no AccessTokenProviderChain configured, creating default-chain");
79 accessTokenProviderChain =
80 Arrays.<AccessTokenProvider> asList(
81 new ImplicitAccessTokenProvider(),
82 new ResourceOwnerPasswordAccessTokenProvider(),
83 new ClientCredentialsAccessTokenProvider()
90 public BeanPostProcessor getBeanPostProcessor(final String clientSecret)
92 log.debug("createing new instance of BeanPostProcessor");
93 return new BeanPostProcessor() {
96 public Object postProcessBeforeInitialization(
103 if (bean instanceof OAuth2RestTemplate)
105 log.info("injecting signed_request-aware AccessTokenProviderChain");
106 OAuth2RestTemplate template = (OAuth2RestTemplate)bean;
107 List<AccessTokenProvider> chain =
108 new LinkedList<>(accessTokenProviderChain);
109 SignedRequestAwareAuthorizationCodeAccessTokenProvider provider =
110 new SignedRequestAwareAuthorizationCodeAccessTokenProvider();
111 provider.setSecret(clientSecret);
112 provider.setObjectMapper(objectMapper);
114 template.setAccessTokenProvider(new AccessTokenProviderChain(chain));
121 public Object postProcessAfterInitialization(