【问题标题】:Spring Boot Social Twitter Authentication failsSpring Boot 社交 Twitter 身份验证失败
【发布时间】:2019-01-06 03:19:16
【问题描述】:

我有一个Spring Boot项目,需要通过Twitter实现授权。

还有什么比这更简单的呢? - 我问自己,然后我被困了几天。

问题是我尝试过的大多数库(监听 /connect/twitter 或 /signin/twitter)都返回相同的响应

Invalid cookie header: "set-cookie: personalization_id=""; Expires=Tue, 28 Jul 2020 20:04:39 GMT; Path=/; Domain=.twitter.com". Invalid 'expires' attribute: Tue, 28 Jul 2020 20:04:39 GMT

我的注意力被这句话吸引了:

Invalid 'expires' attribute

这可以通过配置RestTemplate来解决,但问题是它在配置中深度创建,被私有final字段隐藏。 我认为应该有一个比玩反射 API 更好的决定,我只是不明白

也许有人可以通过 Twitter 推荐正确的授权方式。

测试版本:

  • Spring Boot 版本从 1.5.14 到 2.0.3
  • org.springframework.social:spring-social-twitter 从 1.1.2 到 2.0.0.M4
  • spring-boot-starter-social-twitter 最高 2.0.0.M4

附: Facebook 与 spring-security-oauth2-jose 和 spring-security-oauth2-client 完美配合,但 twitter 没有配置为它的提供者

必须为客户端注册“twitter”指定提供者 ID

【问题讨论】:

    标签: spring-boot twitter-oauth spring-social spring-oauth2 spring-social-twitter


    【解决方案1】:

    听起来您需要配置RestTemplate 以使用标准cookie 规范。这可以通过在RequestConfig.Builder 上设置cookieSpec 然后通过HttpComponentsClientHttpRequestFactory 最终创建RestTemplate 来实现。 比如:

    @Bean
    public RestTemplate restTemplate() {
        RequestConfig requestConfig = RequestConfig.custom()
            .setCookieSpec(CookieSpecs.STANDARD)
            .build();
        HttpComponentsClientHttpRequestFactory factory = new HttpComponentsClientHttpRequestFactory();
        factory.mergeRequestConfig(requestConfig);
    
        return new RestTemplate(factory);
    }
    

    抱歉,目前我没有可用的 IDE/javac,所以这可能无法编译。

    【讨论】:

    • 这可能是一个解决方案,但 ConnectController 使用它自己的 RestTemplate 实例,我无法覆盖它。
    【解决方案2】:

    使用它来配置您的 RestTemplate Bean 以使用标准 cookie 规范

    @Bean
    public RestTemplate restTemplate() {
        return new RestTemplate(getClientHttpRequestFactory());
    }
    
    private HttpComponentsClientHttpRequestFactory getClientHttpRequestFactory() {
        HttpComponentsClientHttpRequestFactory clientHttpRequestFactory = new HttpComponentsClientHttpRequestFactory();
        clientHttpRequestFactory.setHttpClient(getHttpClient());
        return clientHttpRequestFactory;
    }
    
    private HttpClient getHttpClient() {
        return HttpClients.custom()
                .setDefaultRequestConfig(RequestConfig.custom()
                .setCookieSpec(CookieSpecs.STANDARD).build())
                .build();
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-06-24
      • 2022-08-16
      • 1970-01-01
      • 1970-01-01
      • 2020-02-06
      • 1970-01-01
      • 1970-01-01
      • 2019-05-29
      相关资源
      最近更新 更多