Spring Boot社交Twitter身份验证失败

时间:2018-07-29 20:40:18

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

我在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来解决,但是问题在于它是在配置中深层创建的,并由private 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

P.S。 Facebook与spring-security-oauth2-jose和spring-security-oauth2-client完美配合,但是未将twitter配置为提供程序

  

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

2 个答案:

答案 0 :(得分:0)

这听起来像您需要配置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,因此可能无法编译。

答案 1 :(得分:0)

使用此配置您的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();
}
相关问题