Как узнать, действительны ли учетные данные Tumblr OAuth? - PullRequest
2 голосов
/ 11 июля 2011

Используя библиотеку 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 не имеет метода downcaseЯ предполагаю, что вместо этого он ожидает какую-то строку.Но я не знаю, к какому параметру он относится.

Используемый мной access_token и секрет были ранее работоспособны, но я отменил доступ к приложению, чтобы проверить, как его обнаружить.Мне просто нужен какой-то способ узнать, что пользователь больше не зарегистрирован в этой службе, поэтому я могу переключать состояние.

Вот трассировка стека:

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'

Ответы [ 2 ]

1 голос
/ 12 июля 2011

Попробуйте:

@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.

0 голосов
/ 13 июля 2011

Единственный способ заставить это работать без имени пользователя Tumblr - это использование нового API версии 2. Документы здесь: http://www.tumblr.com/docs/en/api/v2

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

Возвращает небольшой конверт JSON с 200 OK или 401 Unauthorized, если токены плохие.

Теперь мне нужно выяснить, как получить имя блога пользователя, поскольку вы больше не можете публиковать в блоге по умолчанию. К счастью, вы можете использовать API v2 и v1 одновременно.

...