【问题标题】:OAauth gem in rails problemRails 问题中的 OAuth gem
【发布时间】:2010-12-04 13:12:11
【问题描述】:

我正在尝试使用 OAuth 进行 twitter api 身份验证,但当我的代码吐出消息时遇到了障碍:

 (instance of OAuth::Consumer needs to have method `marshal_load')

我的代码:

@consumer=OAuth::Consumer.new( "token","secret", {
    :site=>"http://mysite.com/"
  })
@request_token=@consumer.get_request_token
session[:request_token]=@request_token.token
session[:request_token_secret]=@request_token.secret
redirect_to @request_token.authorize_url

错误在会话分配部分。 清除会话存储并不能解决问题。

rake tmp:clear  

代码在 irb 中运行良好,但在应用程序上运行它不起作用。 这可能是什么问题和解决方案?

谢谢!

【问题讨论】:

    标签: ruby-on-rails ruby api oauth gem


    【解决方案1】:

    同样的事情也发生在我身上。这是因为我首先尝试将整个令牌存储在我的会话中:

    会话[:request_token]=@request_token

    然后,我将代码更改为仅在会话中存储令牌(字符串):

    会话[:request_token]=@request_token.token

    但是,我遇到了和你一样的错误

    (OAuth::Consumer 的实例需要有方法 `marshal_load')

    因为 Rails 试图查看我之前存储在会话中的内容(整个令牌)。只需进入浏览器的 cookie 并删除开发主机的所有 cookie(我的是 localhost)。之后,再试一次,一切正常。

    【讨论】:

      【解决方案2】:

      我认为这与this question 的问题相同。

      那里的答案表明,由于令牌不可序列化,因此无法从会话中检索到,您应该将密钥存储在会话中并根据该密钥和密钥创建一个新令牌。

      【讨论】:

      • 这就是我的代码所做的对吗? session[:request_token]=@request_token.token session[:request_token_secret]=@request_token.secret 在我的回调操作中,我正在从会话值创建一个新令牌。
      • 您正在尝试将令牌存储在会话中,但失败了。如果您存储字符串“token”和“secret”(来自您的代码),您可以在需要重用它们时重新构建消费者和令牌。
      【解决方案3】:

      经过一番谷歌搜索后,我想出了自己的解决方案。

      我不知道这是否是最好的解决方案,但这就是我解决它的方法:

      我在 environment.rb 中添加了以下代码:

      class OAuth::Consumer
           def marshal_load(*args)
            self
          end
      

      更多的 hack,这肯定会修复 marshal 加载错误。我不知道这是否会导致其他问题。

      【讨论】:

        猜你喜欢
        • 2011-06-16
        • 1970-01-01
        • 1970-01-01
        • 2011-09-11
        • 2011-12-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多