使用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和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'
答案 0 :(得分:1)
尝试:
@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。
答案 1 :(得分:0)
我可以使用新的v2 API在没有用户的Tumblr用户名的情况下让它工作的唯一方法。文档: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。