Twitter Войти через Spring Boot

Я пытаюсь войти в свое веб-приложение (разработанное с использованием Spring Boot), используя социальные учетные записи. Логины для Google и Facebook в порядке. Но по какой-то причине существует проблема с токеном в логине Twitter. Я создал проект в твиттере на сайте разработчика, получил все полномочия. Пожалуйста, обратитесь к моему коду ниже.

Значения файла My Property указаны ниже.

twitter.client.client-ID = ХХХХХХХ

twitter.client.client секретная = XXXXXXXX

twitter.client.access-token-uri = https://api.twitter.com/oauth/access_token

twitter.client.user-authorization-uri = https://api.twitter.com/oauth/authorize

twitter.client.token имя = oauth_token

twitter.client.authentication-схема = форма

twitter.resource.user-info-uri = https://api.twitter.com/1.1/account/verify_credentials.json

Метод фильтра

private Filter ssoTwitterFilter(String processingUrl, PrincipalExtractor principalExtractor) {
    OAuth2ClientAuthenticationProcessingFilter twitterFilter = new OAuth2ClientAuthenticationProcessingFilter(
            processingUrl);
    LOGGER.debug("processingUrl :{} ", processingUrl);

    twitterFilter.setAuthenticationSuccessHandler(authenticationSuccessHandlerAndRegistrationFilter());
    OAuth2RestTemplate twitterTemplate = new OAuth2RestTemplate(twitter(), oauth2ClientContext);
    twitterFilter.setRestTemplate(twitterTemplate);
    UserInfoTokenServices tokenServices = new UserInfoTokenServices(twitterResource().getUserInfoUri(),
            twitter().getClientId());
    tokenServices.setRestTemplate(twitterTemplate);
    tokenServices.setPrincipalExtractor(principalExtractor);
    return twitterFilter;
}

Это конфигурации бина.

@Bean
@ConfigurationProperties("twitter.client")
public AuthorizationCodeResourceDetails twitter() {
    return new AuthorizationCodeResourceDetails();
}

@Bean
@ConfigurationProperties("twitter.resource")
public ResourceServerProperties twitterResource() {
    return new ResourceServerProperties();
}

Это ошибка, которую я получаю введите описание изображения здесь

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

1 ответ

Решение

Вы можете настроить вход в Twitter следующим образом:

 @Configuration
 @EnableSocial
public class SocialConfig implements SocialConfigurer {

@Autowired
private  UserAuthorizationService userAuthorizationService;
@Override
public void addConnectionFactories(ConnectionFactoryConfigurer cfConfig, Environment env) {

    cfConfig.addConnectionFactory(new TwitterConnectionFactory(
            env.getProperty("twitter.consumer-key"),
            env.getProperty("twitter.consumer-secret")
    ));



}

@Override
public UserIdSource getUserIdSource() {
    return new UserIdSource() {
        @Override
        public String getUserId() {
            Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
            if (authentication == null) {
                throw new IllegalStateException("Unable to get a ConnectionRepository: no user signed in");
            }
            return authentication.getName();
        }
    };
}


@Override
public UsersConnectionRepository getUsersConnectionRepository(ConnectionFactoryLocator connectionFactoryLocator) {
    InMemoryUsersConnectionRepository usersConnectionRepository = new InMemoryUsersConnectionRepository(

            connectionFactoryLocator
    );
    return usersConnectionRepository;
}


@Autowired
private TwitterConnectionSignup twitterConnectionSignup;
@Autowired
private ConnectionFactoryLocator connectionFactoryLocator;

@Autowired
private UsersConnectionRepository usersConnectionRepository;
@Bean
public ProviderSignInController providerSignInController() {
    ((InMemoryUsersConnectionRepository) usersConnectionRepository)
            .setConnectionSignUp(twitterConnectionSignup);

    return new ProviderSignInController(
            connectionFactoryLocator,
            usersConnectionRepository,
            new TwitterSignInAdapter(userAuthorizationService));
}

}

Настройте TwitterConnectionSignup:

@Service
public class TwitterConnectionSignup implements ConnectionSignUp {

@Autowired
private UserRepo userRepo;

@Override
public String execute(Connection<?> connection) {

   //add your logic to save user to your db
    return connection.getDisplayName();
}

}

Теперь настройте TwitterSignInAdapter:

public class TwitterSignInAdapter implements SignInAdapter {
private UserAuthorizationService userAuthorizationService;

public TwitterSignInAdapter(UserAuthorizationService userAuthorizationService) {
    this.userAuthorizationService = userAuthorizationService;
}

@Override
public String signIn(String localUserId, Connection<?> connection, NativeWebRequest webRequest) {

    log.debug(" Email {}", localUserId);

    UserAuthDto userAuthDto = (UserAuthDto) userAuthorizationService.loadUserByUsername(localUserId);
    UsernamePasswordAuthenticationToken updatedAuth = new UsernamePasswordAuthenticationToken(userAuthDto, userAuthDto.getSocialId(),
            userAuthDto.getAuthorities());


    SecurityContextHolder.getContext().setAuthentication(updatedAuth);
    HttpServletRequest servletRequest = webRequest.getNativeRequest(HttpServletRequest.class);
    // add authentication to the session
    servletRequest.getSession().setAttribute(
            HttpSessionSecurityContextRepository.SPRING_SECURITY_CONTEXT_KEY,
            SecurityContextHolder.getContext());


    return "/";
}

}

Другие вопросы по тегам