【问题标题】:How can I tell if Tumblr OAuth credentials are valid?如何判断 Tumblr OAuth 凭据是否有效?
【发布时间】:2011-07-11 18:19:55
【问题描述】:

使用 ruby​​ OAuth 库,我正在尝试验证以前用户的凭据是否仍然有效。 (如果他撤销了我的应用程序的权限)我已经为 Twitter 完成了它,没有问题,因为有一个方便的 .authenticated? Twitter OAuth 库中的方法。但是使用通用库,我找不到类似的方法。

@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_token.get() 调用就得到一个服务器错误,关于 nill 没有小写方法,我猜它期待的是某种类型的字符串。但我不知道它指的是什么参数。

我使用的 access_token 和 secret 以前可以正常工作,但我撤销了对应用程序的访问权限以测试如何检测它。我只是需要一些方法来知道用户不再注册该服务,所以我可以切换状态。

这是一个堆栈跟踪:

NoMethodError - undefined method 'downcase' for nil:NilClass: /Library/Ruby/Gems/1.8/gems/oauth-0.4.4/lib/oauth/request_proxy/base.rb:93:in 'normalized_uri' /Library/Ruby/Gems/1.8/gems/oauth-0.4.4/lib/oauth/request_proxy/base.rb:113:in 'signature_base_string' /Library/Ruby/Gems/1.8/gems/oauth-0.4.4/lib/oauth/signature/base.rb:77:in 'signature_base_string'

【问题讨论】:

    标签: ruby oauth tumblr


    【解决方案1】:

    试试:

    @resp = @access_token.get('http://www.tumblr.com/api/read/json')
    

    编辑,按照下面的 cmets:

    #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。

    【讨论】:

    • 这会产生 404 错误,因为正确的路径是 user.tumblr.com,因为它是公开的,所以无济于事。如果用户已撤销访问权限,我需要一些调用将失败,否则会成功。
    • 这是有道理的。在 ruby​​ 库中,您使用“tumblr.com”进行签名,但尝试使用“user.tumblr.com”访问资源。这违反了oauth规范,这就是失败的原因。我已更新我的回复以包含代码。
    • 谢谢,有道理。但是我仍然无法使用它来验证他们的 OAuth 凭据是否有效,因为调用是公开的,对吧?
    • 是的,你可以。根据要求,如果您收到“无效令牌”的返回值,则需要重新验证。
    • 我将检查以确保它有效并为您提供答案,但可能会借此机会升级到 v2:engineering.tumblr.com/post/7541361718/…
    【解决方案2】:

    在没有用户的 Tumblr 用户名的情况下,我可以让它工作的唯一方法是使用新的 v2 API。文档在这里:http://www.tumblr.com/docs/en/api/v2

    @access_token.get('http://api.tumblr.com/v2/user/dashboard?limit=1')
    

    返回一个带有 200 OK 的小型 JSON 信封,如果令牌错误,则返回 401 Unauthorized。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-05-17
      • 1970-01-01
      • 1970-01-01
      • 2011-04-22
      • 2011-06-03
      • 2016-07-17
      相关资源
      最近更新 更多