require 'cgi'
module Aliyun
class AliyunSign
def create_sign_url(method, param, key, service_type)
if service_type == 'video'
param = video_param.merge(param)
elsif service_type == 'auth'
param = auth_param.merge(param)
else
param = sms_param.merge(param)
end
param[:Signature] = sign_param(method, key, param)
param
end
'''
签名
'''
def sign_param(method, key, param)
# 排序
param = Tools::Sign.sort_param(param)
# 转为url
formatstr = to_query(param)
stringto_sign = method.to_s + '&%2F&' + formatstr
# 签名
signature = sign_string(stringto_sign, key).to_s.chomp
end
'''
视频点播参数
'''
def video_param
time_tamp = Time.now.utc.iso8601()
nonce = Tools::GetRandString.rand_string(30)
param = {
Format: 'JSON', #返回值的类型,支持JSON与XML,默认为XML
Version: '2017-03-21', #API版本号,为日期形式:YYYY-MM-DD,本版本对应为2017-03-21
SignatureMethod: 'HMAC-SHA1', #签名方式,目前支持HMAC-SHA1
Timestamp: time_tamp, #ISO8601标准时间戳
SignatureVersion: '1.0', #签名算法版本,目前版本是1.0
SignatureNonce: nonce #唯一随机数
}
end
'''
加密揭密参数
'''
def auth_param
time_tamp = Time.now.utc.iso8601()
nonce = Tools::GetRandString.rand_string(30)
param = {
Format: 'JSON', #返回值的类型,支持JSON与XML,默认为XML
Version: '2016-01-20', #API版本号,为日期形式:YYYY-MM-DD,本版本对应为2016-01-20
SignatureMethod: 'HMAC-SHA1', #签名方式,目前支持HMAC-SHA1
Timestamp: time_tamp, #ISO8601标准时间戳
SignatureVersion: '1.0' #签名算法版本,目前版本是1.0
}
end
'''
短信参数
'''
def sms_param
time_tamp = Time.now.utc.iso8601()
nonce = Tools::GetRandString.rand_string(30)
param = {
Format: 'JSON', #返回值的类型,支持JSON与XML,默认为XML
RegionId: 'cn-hangzhou', #API支持的RegionID
Version: '2017-05-25', #API版本号,为日期形式:YYYY-MM-DD,本版本对应为2017-05-25
SignatureMethod: 'HMAC-SHA1', #签名方式,目前支持HMAC-SHA1
Timestamp: time_tamp, #ISO8601标准时间戳
SignatureVersion: '1.0', #签名算法版本,目前版本是1.0
SignatureNonce: nonce #唯一随机数
}
end
'''
hash转url参数格式化
'''
def to_query(param)
format = []
#url转义
param.each_with_index do |value|
format << "#{percent_encode(value[0])}=#{percent_encode(value[1])}"
end
percent_encode(format.join('&'))
end
'''
替换字符
'''
def percent_encode(str)
str = CGI::escape(str.to_s)
str = str.gsub('/\+/','%20')
str = str.gsub('/\*/','%2A')
str = str.gsub('/%7E/','~')
end
'''
生成签名
'''
def sign_string(stringto_sign, key)
digest = OpenSSL::Digest.new('sha1')
Base64.encode64(OpenSSL::HMAC.digest(digest, key, stringto_sign))
end
end
end
随机字符串
def self.rand_string(len = 6)
chars = ("a".."z").to_a + ("A".."Z").to_a + ("0".."9").to_a
Array.new(len, '').collect{chars[rand(chars.size)]}.join
end
参数排序
'''
参数从小到大排序
'''
def self.sort_param(data)
data = data.sort{ |a,b| a.to_s <=> b.to_s }.to_h
end