63 lines
2.0 KiB
Ruby
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
|