Ruby 如何判断Tumblr OAuth凭据是否有效?

Ruby 如何判断Tumblr OAuth凭据是否有效?,ruby,oauth,tumblr,Ruby,Oauth,Tumblr,使用ruby OAuth库,我试图验证以前用户的凭据是否仍然有效。(万一他取消了我应用程序的权限)我已经为Twitter做了,没有问题,因为有一个方便的。经过验证的?方法在TwitterOAuth库中。不过,使用泛型库,我找不到类似的方法 @consumer = OAuth::Consumer.new( ENV['TUMBLR_CONSUMER_KEY'], ENV['TUMBLR_CONSUMER_SECRET'], { :site =>

使用ruby OAuth库,我试图验证以前用户的凭据是否仍然有效。(万一他取消了我应用程序的权限)我已经为Twitter做了,没有问题,因为有一个方便的。经过验证的?方法在TwitterOAuth库中。不过,使用泛型库,我找不到类似的方法

@consumer = OAuth::Consumer.new(
        ENV['TUMBLR_CONSUMER_KEY'],
        ENV['TUMBLR_CONSUMER_SECRET'],
        { :site => 'http://www.tumblr.com',
          :request_token_path => '/oauth/request_token',
          :authorize_path => '/oauth/authorize',
          :access_token_path => '/oauth/access_token',
          :http_method => :get
        }
      )
      @access_token = OAuth::AccessToken.new(@consumer, @tumblrauth['access_token'], @tumblrauth['access_token_secret'])
      puts @access_token.inspect
      @resp = @access_token.get('api/read')
      puts @resp.inspect
我在尝试@access\u token.get()调用时发现了一个服务器错误,关于nill没有downcase方法,我猜它应该是某种字符串。但我不知道它指的是什么param

我使用的access_令牌和密码以前是正常的,但我撤销了对应用程序的访问以测试如何检测它。我只需要知道用户不再注册该服务,这样我就可以切换状态

以下是堆栈跟踪:

NoMethodError-未定义nil:NilClass的方法“downcase”:
/Library/Ruby/Gems/1.8/Gems/oauth-0.4.4/lib/oauth/request\u proxy/base.rb:93:in'normalized\u uri'
/Library/Ruby/Gems/1.8/Gems/oauth-0.4.4/lib/oauth/request\u proxy/base.rb:113:in'signature\u base\u string'
/Library/Ruby/Gems/1.8/Gems/oauth-0.4.4/lib/oauth/signature/base.rb:77:在“signature\u base\u string”中
尝试:

@resp = @access_token.get('http://www.tumblr.com/api/read/json')
根据以下评论进行编辑:

#Monkey Patch the Oauth gem to fit the "tumblr" way of doing Oauth
class Net::HTTP
  def address=(new_address)
    @address = new_address
  end
end

module OAuth
  class Consumer

    def tumblr_address=(address)
      @tumblr_address = address
      @orig_address = self.http.address
    end

    def create_signed_request(http_method, path, token = nil, request_options = {}, *arguments)
      # Use the original address to generate OAuth signature
      self.http.address = @orig_address if @orig_address

      request = create_http_request(http_method, path, *arguments)
      sign!(request, token, request_options)

      # Submit the request to the tumblr address
      self.http.address = @tumblr_address if @tumblr_address

      request
    end
  end
end

module OAuth
  class RequestToken
    def get_access_token(options = {}, *arguments)
      response = consumer.token_request(consumer.http_method, (consumer.access_token_url? ? consumer.access_token_url : consumer.access_token_path), self, options, *arguments)
      self.consumer.tumblr_address = response[:subdomain]
      OAuth::AccessToken.from_hash(consumer, response)
    end
  end
end
在@consumer创建之后,在控制器中添加以下内容:

@consumer.tumblr_address = "http://user.tumblr.com"

注意:这是未经测试的代码,因此YMMV。

在没有用户Tumblr用户名的情况下,我可以让它工作的唯一方法是使用新的v2 API。此处的文档:

返回一个带有200 OK的小JSON信封,如果令牌不正确,则返回401 Unauthorized


现在我必须弄清楚如何获取用户的博客名,因为您似乎无法再发布到默认博客。幸运的是,您可以同时使用v2和v1 API。

这会产生404错误,因为正确的路径是user.tumblr.com,但由于它是公共的,因此没有帮助。我需要一些调用,如果用户撤销了访问权限,这些调用将失败,否则将成功。这是有意义的。在ruby库中,您使用“”进行签名,但尝试使用“”访问资源。它违反了oauth规范,这就是为什么它失败的原因。我已经更新了我的回复以包含代码。谢谢,这很有意义。但是我仍然不能用这个来验证他们的OAuth凭据是否有效,因为这个调用是公共的,对吗?是的,你可以。根据请求,如果您收到“无效令牌”的返回值,则需要重新身份验证。我将检查以确保此操作有效,并为您提供答案,但可能会借此机会升级到v2:
@access_token.get('http://api.tumblr.com/v2/user/dashboard?limit=1')