Oauth 1.0a消费代码,等于访问令牌两次

Oauth 1.0a消费代码,等于访问令牌两次,oauth,spring-security,Oauth,Spring Security,我已经安装了一个消费者应用程序,大多数oauth工作流看起来都是正确的,但由于某种原因,在提供者调用回调url后,它会尝试两次获取访问令牌。第一次有效 [OAuth OAuth_consumer_key=“itd79n64zlwv5hhv”,OAuth_nonce=“cac26978-c36c-4a8b-8f3e-3e779ff927ab”,OAuth_signature=“5c8bm9qoijxc2f5ixpqgtsqsys%3D”,OAuth_signature_方法=“HMAC-SHA1

我已经安装了一个消费者应用程序,大多数oauth工作流看起来都是正确的,但由于某种原因,在提供者调用回调url后,它会尝试两次获取访问令牌。第一次有效

[OAuth OAuth_consumer_key=“itd79n64zlwv5hhv”,OAuth_nonce=“cac26978-c36c-4a8b-8f3e-3e779ff927ab”,OAuth_signature=“5c8bm9qoijxc2f5ixpqgtsqsys%3D”,OAuth_signature_方法=“HMAC-SHA1”,OAuth_时间戳=“1458938403”,OAuth_令牌=“5451cf20-7eed-4797-819c-eed-819c-ee6981654”,OAuth_验证器=“de555;-de555f-de555f-f1b-f1”,FEF50

响应为200,有效负载包括oauth_令牌=a95d6305-4261-4c1d-a9b0-43411a0c2f2c和oauth_令牌=573702d2-70ca-412c-84e5-868e9ee07169

但是,它再次调用URL

[OAuth OAuth_consumer_key=“itd79n64zlwv5hhv”,OAuth_nonce=“6c013ef9-2f3c-49dd-84fb-97db73b5fb39”,OAuth_签名=“5rtqe5tcquwefvyqjexh1eio%3D”,OAuth_签名方法=“HMAC-SHA1”,OAuth_时间戳=“1458938403”,OAuth_令牌=“5451cf20-7eed-4797-819c-ee2316981654”,OAuth_验证器=“de555-de555-795e-f5e-f5f-f1b”,OAuth-f1b-f1b.951

这会导致服务器上出现异常,因为请求令牌已被删除,并且访问令牌已被发出

在逐步浏览代码时,我可以看到OAuthConsumerContextFilter在第一次调用后很好地存储了访问令牌

不知何故,过滤器链最终使用请求令牌将其带回CoreAuthConsumerSupport中的readResource

我使用spring boot构建了消费者应用程序

发件人:applicationContext.xml

    <bean id="oscarService" class="com.mdumontier.oscar.labline.service.OscarService">
        <property name="oscarRestTemplate">
            <bean class="org.springframework.security.oauth.consumer.client.OAuthRestTemplate">
                <constructor-arg ref="oscar" />
            </bean>
        </property>

    </bean>

 <security:authentication-manager>
    <security:authentication-provider>
      <security:user-service>
        <security:user name="marissa" password="wombat" authorities="ROLE_USER" />
        <security:user name="sam" password="kangaroo" authorities="ROLE_USER" />
      </security:user-service>
    </security:authentication-provider>
  </security:authentication-manager>

<security:http auto-config='true' >

  </security:http>



 <oauth:consumer resource-details-service-ref="resourceDetails" oauth-failure-page="/oauth_error.jsp">
    <oauth:url pattern="/oscar/**" resources="oscar"/>
  </oauth:consumer>


  <oauth:resource-details-service id="resourceDetails">
    <oauth:resource id="oscar"
                    key="itd79n64zlwv5hhv"
                    secret="d3psvmrn8k1xws9x"
                    request-token-url="http://localhost:8080/app/ws/oauth/initiate"
                    user-authorization-url="http://localhost:8080/app/ws/oauth/authorize"
                    access-token-url="http://localhost:8080/app/ws/oauth/token"/>
  </oauth:resource-details-service>

Spring Boot会自动注册在主应用程序筛选器链中实现筛选器的所有bean。有关更多详细信息,请参阅

oauth:consumer helper将两个oauth筛选器注册为bean,并且似乎有一段时间没有更新。我甚至无法在最新的Spring引导下使XML配置正常工作。无论如何,这意味着这两个筛选器都将运行两次,对于OAuthConsumerContextFilter,这是破坏性的,因为它将在secu之外运行rity子链,每次都失败

要解决这个问题,您有两个选择

第一,提示Spring Boot通过为自动获取的每个过滤器提供FilterRegistrationBean来避免这种行为,如下所示:

@Bean
public FilterRegistrationBean registration(OAuthConsumerContextFilter filter) {
    FilterRegistrationBean registration = new FilterRegistrationBean(filter);
    registration.setEnabled(false);
    return registration;
}
第二,完全绕过XML配置,使用Java配置。我在下面的回答中发布了一个完整的工作代码示例,说明如何在Spring Boot中使用Java配置访问OAuth 1 consumer:

在Java配置中,您必须重复FilterRegistrationBean技巧,或者首先不将这些过滤器注册为bean,而是直接使用安全过滤器链创建和注册实例