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.http.OAuth2ErrorHandler;
20 import org.springframework.security.oauth2.client.token.AccessTokenProvider;
21 import org.springframework.security.oauth2.client.token.AccessTokenProviderChain;
22 import org.springframework.security.oauth2.client.token.grant.client.ClientCredentialsAccessTokenProvider;
23 import org.springframework.security.oauth2.client.token.grant.implicit.ImplicitAccessTokenProvider;
24 import org.springframework.security.oauth2.client.token.grant.password.ResourceOwnerPasswordAccessTokenProvider;
25 import org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter;
30 * This class injects the facebook-utils into the spring-oauth2-configuration
35 public class FacebookUtils
37 private final Logger log = LoggerFactory.getLogger(FacebookUtils.class);
40 @Autowired(required=false)
41 private List<AccessTokenProvider> accessTokenProviderChain;
43 * Needed, to extract Jackson-ObjectMapper.
44 * Defined by <mvc:annotation-driven />
47 private RequestMappingHandlerAdapter requestMappingHandlerAdapter;
49 private ObjectMapper objectMapper;
55 for (HttpMessageConverter<?> messageConverter : requestMappingHandlerAdapter.getMessageConverters())
57 if (messageConverter instanceof MappingJacksonHttpMessageConverter)
59 MappingJacksonHttpMessageConverter m =
60 (MappingJacksonHttpMessageConverter)messageConverter;
61 objectMapper = m.getObjectMapper();
63 "found ObjectMapper {} ({})",
65 objectMapper.getClass().getCanonicalName()
70 if (objectMapper == null)
72 throw new RuntimeException(
73 "Unable to find MappingJAcksonHttpMessageConverter!"
77 if (accessTokenProviderChain == null)
79 log.info("no AccessTokenProviderChain configured, creating default-chain");
80 accessTokenProviderChain =
81 Arrays.<AccessTokenProvider> asList(
82 new ImplicitAccessTokenProvider(),
83 new ResourceOwnerPasswordAccessTokenProvider(),
84 new ClientCredentialsAccessTokenProvider()
91 public BeanPostProcessor getBeanPostProcessor(final String clientSecret)
93 log.debug("createing new instance of BeanPostProcessor");
94 return new BeanPostProcessor() {
97 public Object postProcessBeforeInitialization(
104 if (bean instanceof OAuth2RestTemplate)
106 log.info("injecting signed_request-aware AccessTokenProviderChain");
107 OAuth2RestTemplate template = (OAuth2RestTemplate)bean;
108 List<AccessTokenProvider> chain =
109 new LinkedList<>(accessTokenProviderChain);
110 SignedRequestAwareAuthorizationCodeAccessTokenProvider provider =
111 new SignedRequestAwareAuthorizationCodeAccessTokenProvider();
112 provider.setSecret(clientSecret);
113 provider.setObjectMapper(objectMapper);
115 template.setAccessTokenProvider(new AccessTokenProviderChain(chain));
116 log.info("injecting GraphApiErrorHandler");
117 template.setErrorHandler(
118 new GraphApiErrorHandler(
119 (OAuth2ErrorHandler)template.getErrorHandler()
128 public Object postProcessAfterInitialization(