我正在尝试将 Twitter 身份验证(最好是 SSO)集成到 Vaadin 应用程序中。为此,我从头开始创建了一个 Vaadin 应用程序并尝试集成 pac4j(参见以下步骤)。不幸的是,我收到错误“代码”:32,“消息”:“无法验证您。” 尽管有效的电子邮件/密码组合。任何想法如何让它发挥作用?
从https://vaadin.com/start/v14下载 Vaadin 14.2 项目
运行 Application.java 并访问 localhost:8080 工作正常。
使用 pac4j 为 Spring Boot 扩展 pom.xml:
<!-- https://mvnrepository.com/artifact/org.pac4j/spring-security-pac4j --> <dependency> <groupId>org.pac4j</groupId> <artifactId>spring-security-pac4j</artifactId> <version>5.1.0</version> </dependency>
使用 pac4j 为 Twitter 客户端扩展 pom.xml:
<!-- https://mvnrepository.com/artifact/org.pac4j/pac4j-oauth --> <dependency> <groupId>org.pac4j</groupId> <artifactId>pac4j-oauth</artifactId> <version>4.0.3</version> </dependency>
使用 Spring Security 扩展 pom.xml
<!-- https://mvnrepository.com/artifact/org.springframework.security/spring-security-config --> <dependency> <groupId>org.springframework.security</groupId> <artifactId>spring-security-config</artifactId> </dependency>
创建类 Pac4jConfig 就像本演示文稿中的 Spring Security 示例一样http://www.pac4j.org/gettingstarted.html
import org.pac4j.core.config.Config; import org.pac4j.oauth.client.TwitterClient; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @Configuration public class Pac4jConfig { @Bean public Config config() { TwitterClient twitterClient = new TwitterClient(); Config config = new Config("http://localhost:8080", twitterClient); return config; } }
像本演示文稿中的 Spring Security 示例一样创建类 SecurityConfig http://www.pac4j.org/gettingstarted.html
import org.pac4j.core.config.Config; import org.pac4j.springframework.security.web.CallbackFilter; import org.pac4j.springframework.security.web.SecurityFilter; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Configuration; import org.springframework.core.annotation.Order; import org.springframework.security.config.annotation.web.builders.HttpSecurity; import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; import org.springframework.security.web.authentication.www.BasicAuthenticationFilter; @EnableWebSecurity public class SecurityConfig { @Configuration @Order(1) public static class TwitterWebSecurityConfigurationAdapter extends WebSecurityConfigurerAdapter { @Autowired private Config config; protected void configure(final HttpSecurity http) throws Exception { final SecurityFilter filter = new SecurityFilter(config, "TwitterClient"); http.antMatcher("/twitter/**").addFilterBefore(filter, BasicAuthenticationFilter.class); } } @Configuration public static class DefaultWebSecurityConfigurationAdapter extends WebSecurityConfigurerAdapter { @Autowired private Config config; protected void configure(final HttpSecurity http) throws Exception { final CallbackFilter callbackFilter = new CallbackFilter(config); http.authorizeRequests().anyRequest().permitAll().and().addFilterBefore(callbackFilter, BasicAuthenticationFilter.class); } } }
在本演示文稿http://www.pac4j.org/gettingstarted.html的 Spring Security 示例中创建类 TwitterTestApplication,如类“Application”
import java.util.Map; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; @Controller public class TwitterTestApplication { @RequestMapping("/twitter/index.html") public String twitter(HttpServletRequest request, HttpServletResponse response, Map<String, Object> map) { return "Hello world"; } }
调用 http://localhost:8080/twitter/index.html 会导致这个错误:
There was an unexpected error (type=Internal Server Error, status=500). key cannot be blank org.pac4j.core.exception.TechnicalException: key cannot be blank at org.pac4j.core.util.CommonHelper.assertTrue(CommonHelper.java:107) [...]
通过我的凭据扩展 TwitterClient 的构造函数调用(当我在 twitter.com 上复制/粘贴它们时工作正常)并允许电子邮件:
TwitterClient twitterClient = new TwitterClient("[my-email]", "[my-password]", true);
调用 http://localhost:8080/twitter/index.html 会导致这个错误:
There was an unexpected error (type=Internal Server Error, status=500). com.github.scribejava.core.exceptions.OAuthException: Response body is incorrect. Can't extract token and secret from this: '{"errors":[{"code":32,"message":"Could not authenticate you."}]}' org.pac4j.core.exception.TechnicalException: com.github.scribejava.core.exceptions.OAuthException: Response body is incorrect. Can't extract token and secret from this: '{"errors":[{"code":32,"message":"Could not authenticate you."}]}' at org.pac4j.oauth.redirect.OAuth10RedirectionActionBuilder.getRedirectionAction(OAuth10RedirectionActionBuilder.java:62) at org.pac4j.core.client.IndirectClient.getRedirectionAction(IndirectClient.java:109) at org.pac4j.core.engine.DefaultSecurityLogic.redirectToIdentityProvider(DefaultSecurityLogic.java:224) at org.pac4j.core.engine.DefaultSecurityLogic.perform(DefaultSecurityLogic.java:157) at org.pac4j.springframework.security.web.SecurityFilter.doFilter(SecurityFilter.java:73) at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) at org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:116)