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 "/";
}
}