当前位置: 首页 > 知识库问答 >
问题:

Oauth 1.0一个消费者代码,相当于两次访问令牌

闾丘成双
2023-03-14

响应为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=“HMAC-SHA1”,oauth_timestamp=“1458938403”,oauth_token=“981654”,oauth_verifier=“C56DE555-79DF-455E-AB87-F5F11B953FEF”,oauth_version=“1.0”

由于请求令牌已移除且访问令牌已发出,因此导致服务器上出现异常。

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

不知何故,筛选器链最终将它带着请求令牌带回到CoreOAuthConsumerSupport中的readResource。

发件人: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>

共有1个答案

汝岳
2023-03-14

Spring Boot自动注册主应用程序过滤器链中实现过滤器的所有bean。有关更多细节,请参见:https://stackoverflow.com/a/28428154。

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

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

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

@Bean
public FilterRegistrationBean registration(OAuthConsumerContextFilter filter) {
    FilterRegistrationBean registration = new FilterRegistrationBean(filter);
    registration.setEnabled(false);
    return registration;
}

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

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

 类似资料:
  • 我使用Oauth已经有一段时间了,但从来没有完全确定这四个术语之间的区别(以及每个术语的功能)。我经常看到(例如在Twitter公共API中) 消费者秘密: 和 但我从来都不知道他们到底在干什么。我知道Oauth有能力授权应用程序(让它们代表用户行事),但我不理解这四个授权条款之间的关系,希望得到解释。 基本上,我不确定访问令牌或令牌密钥是如何生成的,它们存储在哪里,以及它们之间或与使用者密钥和密

  • 我有一个Kafka系统,看起来像这样(所有消费者都在一个消费者群体中): 在每个消费者中,我轮询消息,然后进行昂贵的计算(从1到60秒)。如果操作成功,我将提交消费者。 在我提交之前,另一个使用者是否会开始处理相同的消息?我需要保证,一旦消息被拾取,它就会被只执行一次 - 除非处理中途失败。

  • 问题内容: 我有一个JMS客户端,它正在生成消息并通过JMS队列发送到其唯一的使用者。 我想要的是不止一个消费者收到这些消息。我想到的第一件事是将队列转换为主题,以便现有用户和新用户都可以订阅并将相同的消息传递给他们。 显然,这将涉及在生产者和消费者方面修改当前的客户代码。 我还要查看其他选项,例如创建第二个队列,这样就不必修改现有的使用者。我相信这种方法有很多优点,例如(如果我错了,请纠正我)在

  • 我以前认为设置我的消费者将始终收到他们尚未收到的消息,但最近我发现情况并非如此。这只在使用者尚未提交抵消时才起作用。在任何其他情况下,使用者将继续接收偏移大于其提交的最后偏移的消息。 由于我总是使用随机的组ID创建新的使用者,我意识到我的使用者“没有内存”,他们是新的使用者,并且他们永远不会提交偏移,因此策略将始终适用。我的疑虑就从这里开始了。假设以下场景: 我有两个客户端应用程序,A和B,每个客

  • 由于消息需求的排序,我们有一个主题和一个分区。我们有两个消费者运行在不同的服务器上,具有相同的配置集,即groupId、consumerId和consumerGroup。即 1主题- 当我们部署消费者时,相同的代码会部署在两台服务器上。当消息到来时,我们会注意到两个消费者都在消费消息,而不是只有一个处理。让消费者在两台独立的服务器上运行的原因是,如果一台服务器崩溃,至少其他服务器可以继续处理消息。

  • 我有一个生产者/消费者场景,我不希望一个生产者交付产品,多个消费者消费这些产品。然而,常见的情况是,交付的产品只被一个消费者消费,而其他消费者从未看到过这个特定的产品。我不想实现的是,一个产品被每个消费者消费一次,而没有任何形式的阻碍。 我的第一个想法是使用多个BlockingQueue,每个消费者使用一个,并使生产者将每个产品按顺序放入所有可用的BlockingQueues中。但是,如果其中一个