Oauth 1.0a消费代码,等于访问令牌两次
我已经安装了一个消费者应用程序,大多数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.xmlOauth 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
<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,而是直接使用安全过滤器链创建和注册实例