gpt4 book ai didi

spring-boot - 使用 Spring Boot 登录

转载 作者:行者123 更新时间:2023-12-04 01:58:36 27 4
gpt4 key购买 nike

我正在尝试使用社交登录登录我的 Web 应用程序(使用 Spring Boot 开发)。 Google 和 facebook 的登录没问题。但由于某种原因,Twitter 登录中存在 token 问题。我已经在 Twitter 开发者网站上创建了项目,并获得了所有凭据。请引用我下面的代码。

我的属性文件值如下所述。

twitter.client.client-id=XXXXXXX

twitter.client.client-secret=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-name=oauth_token

twitter.client.authentication-scheme=form

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 配置。

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

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

这是我得到的错误 enter image description here

请任何人对此有所了解。因为我发现的所有样本都与从 Twitter 获取配置文件信息有关,因为我需要一个样本来使用 spring Boot 登录。提前致谢

最佳答案

您可以像这样配置 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 "/";
}

关于spring-boot - 使用 Spring Boot 登录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48947215/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com