2015-03-04 5 views
2

У меня есть приложение Spring MVC, которое использует Spring Social Facebook для включения входа в Facebook. Это нормально работает на моей локальной машине, но в настоящее время она не работает в моей промежуточной среде. Моя проблема в том, что я не могу понять, что пошло не так. Когда я пытаюсь войти в систему, я перенаправляюсь в Facebook для авторизации приложения. Эта часть работает нормально. Но когда я разрешаю приложение, все, что происходит, это то, что я перенаправлен обратно на http://example.com/signin?error=provider#_=_, что дает ошибку 404 Not Found.Включение ведения журнала для Spring Social

Это не страшно полезно для отладки источника ошибки и просмотра моих файлов журнала Tomcat, я не могу найти никакой информации, которая могла бы помочь мне найти ошибку. Нет следов стека, сообщений об ошибках и т.п. Я включил log4j в свой проект, но я не вижу никаких журналов из Spring Social. На самом деле я не знаю, как настроить ведение журнала для Spring Social, но я попробовал следующее в моем log4j2.xml файла:

<?xml version="1.0" encoding="UTF-8"?> 
<Configuration status="DEBUG"> 
    <Appenders> 
     <Console name="Console" target="SYSTEM_OUT"> 
      <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/> 
     </Console> 
    </Appenders> 

    <Loggers> 
     <Logger name="com.example" level="trace"> 
      <AppenderRef ref="Console" /> 
     </Logger> 

     <Logger name="org.springframework.social" level="all"> 
      <AppenderRef ref="Console" /> 
     </Logger> 

     <Logger name="org.springframework.social.facebook" level="all"> 
      <AppenderRef ref="Console" /> 
     </Logger> 

     <Logger name="org.springframework.social.security" level="all"> 
      <AppenderRef ref="Console" /> 
     </Logger> 

     <Root level="error"> 
      <AppenderRef ref="Console" /> 
     </Root> 
    </Loggers> 
</Configuration> 

Однако, я не вижу никаких Spring Социальных журналов в моей консоли. Ведение журнала работает отлично, если я пишу ему в своем приложении, как показано ниже, поэтому регистрация должна работать нормально.

@Controller 
public class IndexController { 
    private static Logger logger = LogManager.getLogger(IndexController.class); 

    @RequestMapping("/") 
    public String home() { 
     logger.debug("Hello there from logger!"); 
     return "home"; 
    } 
} 

Как настроить ведение журнала для Spring Social? Я нашел несколько примеров, которые настраивают log4j так, как я делаю (например, one used for Spring Social tests), но в остальном ничего. Я полагаю, что библиотека поддерживает это, потому что в противном случае я не знаю, как отлаживать ошибки. Или есть другой способ, который я могу узнать, что вызывает ошибку?

Ниже приведена моя социальная конфигурация, хотя я не думаю, что это важно в этом случае.

@Configuration 
public class SocialConfig { 
    @Autowired 
    private DataSource dataSource; 

    @Autowired 
    private TextEncryptor textEncryptor; 

    @Autowired 
    private AccountService accountService; 

    @Autowired 
    private AccountRepository accountRepository; 

    @Value("${facebook.app.id}") 
    private String facebookAppId; 

    @Value("${facebook.app.secret}") 
    private String facebookAppSecret; 

    @Bean 
    public ProviderSignInController providerSignInController() { 
     ProviderSignInController controller = new ProviderSignInController(this.connectionFactoryLocator(), this.usersConnectionRepository(), new SpringSecuritySignInAdapter(this.accountRepository)); 
     controller.addSignInInterceptor(new RedirectToPreviousPageInterceptor(controller)); 

     return controller; 
    } 

    @Bean 
    public ConnectionFactoryRegistry connectionFactoryLocator() { 
     ConnectionFactoryRegistry connectionFactoryRegistry = new ConnectionFactoryRegistry(); 
     List<ConnectionFactory<?>> connectionFactories = new ArrayList<ConnectionFactory<?>>(); 
     connectionFactories.add(this.facebookConnectionFactory()); 
     connectionFactoryRegistry.setConnectionFactories(connectionFactories); 

     return connectionFactoryRegistry; 
    } 

    @Bean 
    public FacebookConnectionFactory facebookConnectionFactory() { 
     FacebookConnectionFactory connectionFactory = new FacebookConnectionFactory(this.facebookAppId, this.facebookAppSecret); 
     connectionFactory.setScope("email"); 

     return connectionFactory; 
    } 

    @Bean 
    public JdbcUsersConnectionRepository usersConnectionRepository() { 
     JdbcUsersConnectionRepository repository = new JdbcUsersConnectionRepository(this.dataSource, this.connectionFactoryLocator(), this.textEncryptor); 
     repository.setConnectionSignUp(this.accountService); 

     return repository; 
    } 
} 

спасибо, что заранее.

ответ

0

Мне удалось решить эту проблему после многих проб и ошибок. Оказалось, что мои зависимостей в проекте были неверными, и ведение журнала Spring Framework неправильно отправлено в log4j через slf4j. Я использовал следующий Maven зависимости:

<dependency> 
    <groupId>org.apache.logging.log4j</groupId> 
    <artifactId>log4j-api</artifactId> 
    <version>2.2</version> 
</dependency> 

<dependency> 
    <groupId>org.apache.logging.log4j</groupId> 
    <artifactId>log4j-core</artifactId> 
    <version>2.2</version> 
</dependency> 

<dependency> 
    <groupId>org.slf4j</groupId> 
    <artifactId>slf4j-api</artifactId> 
    <version>1.7.5</version> 
</dependency> 

<dependency> 
    <groupId>org.apache.logging.log4j</groupId> 
    <artifactId>log4j-slf4j-impl</artifactId> 
    <version>2.2</version> 
</dependency> 

Затем я включил запись в журнале Spring Framework с log4j2.xml публикуемыми в вопросе, и погребенный в миллиард бревен, я обнаружил следующее:

ERROR org.springframework.social.connect.web.ProviderSignInController - Exception while completing OAuth 2 connection: 
java.lang.IllegalArgumentException: Unable to initialize due to invalid secret key 
    at org.springframework.security.crypto.encrypt.CipherUtils.initCipher(CipherUtils.java:110) ~[spring-security-core-3.2.5.RELEASE.jar:3.2.5.RELEASE] 
    at org.springframework.security.crypto.encrypt.AesBytesEncryptor.encrypt(AesBytesEncryptor.java:65) ~[spring-security-core-3.2.5.RELEASE.jar:3.2.5.RELEASE] 
    at org.springframework.security.crypto.encrypt.HexEncodingTextEncryptor.encrypt(HexEncodingTextEncryptor.java:36) ~[spring-security-core-3.2.5.RELEASE.jar:3.2.5.RELEASE] 
    at org.springframework.social.connect.jdbc.JdbcConnectionRepository.encrypt(JdbcConnectionRepository.java:236) ~[spring-social-core-1.1.0.RELEASE.jar:1.1.0.RELEASE] 
    at org.springframework.social.connect.jdbc.JdbcConnectionRepository.addConnection(JdbcConnectionRepository.java:167) ~[spring-social-core-1.1.0.RELEASE.jar:1.1.0.RELEASE] 
    at org.springframework.social.connect.jdbc.JdbcUsersConnectionRepository.findUserIdsWithConnection(JdbcUsersConnectionRepository.java:89) ~[spring-social-core-1.1.0.RELEASE.jar:1.1.0.RELEASE] 
    at org.springframework.social.connect.web.ProviderSignInController.handleSignIn(ProviderSignInController.java:260) ~[spring-social-web-1.1.0.RELEASE.jar:1.1.0.RELEASE] 
    at org.springframework.social.connect.web.ProviderSignInController.oauth2Callback(ProviderSignInController.java:217) [spring-social-web-1.1.0.RELEASE.jar:1.1.0.RELEASE] 
    ... 
Caused by: java.security.InvalidKeyException: Illegal key size 
    at javax.crypto.Cipher.checkCryptoPerm(Cipher.java:1034) ~[?:1.8.0_20] 
    at javax.crypto.Cipher.implInit(Cipher.java:800) ~[?:1.8.0_20] 
    at javax.crypto.Cipher.chooseProvider(Cipher.java:859) ~[?:1.8.0_20] 
    at javax.crypto.Cipher.init(Cipher.java:1370) ~[?:1.8.0_20] 
    at javax.crypto.Cipher.init(Cipher.java:1301) ~[?:1.8.0_20] 
    at org.springframework.security.crypto.encrypt.CipherUtils.initCipher(CipherUtils.java:105) ~[spring-security-core-3.2.5.RELEASE.jar:3.2.5.RELEASE] 
    ... 85 more 

Как вам может быть видно, что причиной была слишком длинная длина ключа, поскольку JDK поддерживает только 128-битное шифрование по умолчанию из-за политики. Чтобы решить эту проблему, я последовал совету от this SO question. Это объясняется в моих деталях в this excellent blog post. Для OS X JAVA_HOME находится в /System/Library/Frameworks/JavaVM.framework/Versions/CurrentJDK/Home, поэтому вы вставляете файлы в /System/Library/Frameworks/JavaVM.framework/Versions/CurrentJDK/Home/jre/lib/security. Эта проблема возникла из-за того, что на моей машине разработки был использован текстовый шифр noOpText, и когда я переместил приложение в промежуточную среду, у меня было приложение, настроенное для использования querable text encryptor. Убедившись, что длина ключа больше не ограничена 128 битами, мне пришлось увеличить длину таблицы userconnection таблицы accesstoken до varchar(255). Это оно! Теперь он работает правильно.

Надеюсь, это поможет кому-то в подобной ситуации.