首页 > 解决方案 > 在 Vaadin 14.2 应用程序中使用 pac4j 通过 Twitter 进行身份验证:“code”:32,“message”:“无法对您进行身份验证。”

问题描述

我正在尝试将 Twitter 身份验证(最好是 SSO)集成到 Vaadin 应用程序中。为此,我从头开始创建了一个 Vaadin 应用程序并尝试集成 pac4j(参见以下步骤)。不幸的是,我收到错误“代码”:32,“消息”:“无法验证您。” 尽管有效的电子邮件/密码组合。任何想法如何让它发挥作用?

  1. 从https://vaadin.com/start/v14下载 Vaadin 14.2 项目

  2. 运行 Application.java 并访问 localhost:8080 工作正常。

  3. 使用 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>
    
  4. 使用 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>
    
  5. 使用 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>
    
  6. 创建类 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;
         }
     }
    
  7. 像本演示文稿中的 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);
             }
         }
     }
    
  8. 在本演示文稿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";
         }
     }
    
  9. 调用 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)
         [...]
    
  10. 通过我的凭据扩展 TwitterClient 的构造函数调用(当我在 twitter.com 上复制/粘贴它们时工作正常)并允许电子邮件:

    TwitterClient twitterClient = new TwitterClient("[my-email]", "[my-password]", true);
    
  11. 调用 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)
    

标签: twitterspring-securityvaadinpac4j

解决方案


推荐阅读