Oauth 1.0a消费者代码两次征服访问令牌

时间:2016-03-25 20:59:00

标签: oauth spring-security

我已经设置了一个消费者应用,并且大多数oauth工作流看起来都是正确的,但由于某些原因,在提供商调用回调网址后,它会尝试获取访问令牌TWICE。第一次工作

http://localhost:8080/app/ws/oauth/token [OAuth oauth_consumer_key =" itd79n64zlwv5hhv",oauth_nonce =" cac26978-c36c-4a8b-8f3e-3e779ff927ab",oauth_signature =" 5c8BM9qQoijXC2f5IXpQGtSQsys%3D",oauth_signature_method =&#34 ; HMAC-SHA1",oauth_timestamp =" 1458938403",oauth_token =" 5451cf20-7eed-4797-819c-ee2316981654",oauth_verifier =" c56de555-79df-455e- ab87-f5f11b953fef",oauth_version =" 1.0"]

响应是200,有效载荷包括oauth_token = a95d6305-4261-4c1d-a9b0-43411a0c2f2c& oauth_token_secret = 573702d2-70ca-412c-84e5-868e9ee07169

然后,它再次调用URL。

http://localhost:8080/app/ws/oauth/token [OAuth oauth_consumer_key =" itd79n64zlwv5hhv",oauth_nonce =" 6c013ef9-2f3c-49dd-84fb-97db73b5fb39",oauth_signature =" 5RTQE5XtcqUwEFVvYQjExhH1eio%3D",oauth_signature_method =&#34 ; HMAC-SHA1",oauth_timestamp =" 1458938403",oauth_token =" 5451cf20-7eed-4797-819c-ee2316981654",oauth_verifier =" c56de555-79df-455e- ab87-f5f11b953fef",oauth_version =" 1.0"

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

当单步执行代码时,我可以看到OAuthConsumerContextFilter在第一次调用后存储了访问令牌。

不知何故,过滤器链最终将它带回到CoreOAuthConsumerSupport中的readResource并带有请求令牌。

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

from:applicationContext.xml

setLocal('test_message', 'Hello World!');
var test_message = getLocal('test_message');
console.log(test_message); //Hello World!

1 个答案:

答案 0 :(得分:0)

Spring Boot会自动注册在主应用程序过滤器链中实现Filter的任何Bean。有关详细信息,请参阅:https://stackoverflow.com/a/28428154

oauth:使用者帮助器将两个OAuth过滤器都注册为bean,并且似乎暂时没有更新。在最新的Spring Boot下,我甚至无法使XML配置正常工作。无论如何,这意味着两者都将运行两次,并且在OAuthConsumerContextFilter的情况下,这是破坏性的,因为它将在安全子链之外运行并且每次都失败。

要解决此问题,您有两种选择。

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

3rd ViewController

二,完全绕过XML配置并使用Java配置。我已经发布了一个完整的工作代码示例,在此答案中使用Java配置在Spring Boot中获取OAuth 1使用者:https://stackoverflow.com/a/42143001/2848158

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