javaeye3/lib/multi_auth/weibo.rb

63 lines
2.0 KiB
Ruby

require 'rubygems'
require 'timeout'
require 'rest-client'
OpenSSL::SSL::VERIFY_PEER = OpenSSL::SSL::VERIFY_NONE # weibo 的 ssl 证书未准备好
module MultiAuth
class Weibo < Strategy
AppConfig = {
:service_name => "新浪微博",
:app_key => "3842512498",
:app_secret => "e8c38d3dc7c044b80c709d61f9acd70c",
:callback => "http://www.iteye.com/auth/weibo/callback"
}
def initialize(params, auth_hash = nil)
@params = params
end
def request
@auth_hash = {
:provider => 'weibo',
:redirect_to => "https://api.weibo.com/oauth2/authorize?response_type=code&client_id=#{AppConfig[:app_key]}&redirect_uri=#{URI.escape AppConfig[:callback]}",
}
end
def callback
uid = Timeout::timeout(5) do
@access_token = JSON.parse( RestClient.post('https://api.weibo.com/oauth2/access_token', :client_id => AppConfig[:app_key], :client_secret => AppConfig[:app_secret], :grant_type => 'authorization_code', :code => @params[:code], :redirect_uri => AppConfig[:callback]))['access_token']
JSON.parse(RestClient.get("https://api.weibo.com/2/account/get_uid.json?access_token=#{@access_token}"))['uid']
end
raise Error, "验证失败" unless uid
@auth_hash = {
:provider => 'weibo',
:uid => uid,
:credentials => {
:access_token => @access_token,
}
}
rescue Timeout::Error
raise Error, "访问超时,请稍后重试"
end
def user_info
user_info = Timeout::timeout(5) do
JSON.parse(RestClient.get("https://api.weibo.com/2/users/show.json?uid=#{@auth_hash[:uid]}&access_token=#{@access_token}"))
end
unless user_info["name"]
Rails.logger.info "Weibo获取用户信息错误:" + user_info.inspect
raise Error, "获取用户信息时发生错误,请稍后重试"
end
{:name => user_info["name"]}
rescue Timeout::Error
raise Error, "访问超时,请稍后重试"
end
end
end