CDN加速

URL鉴权计算器

更新时间:2021-03-31 17:25:49

功能介绍

通过鉴权计算器,可以模拟各配置值产生的鉴权参数,将原始访问URL加密成需要鉴权的URL,从而更进一步了解各鉴权模式的使用方式。

操作步骤

  1. 登录网宿CDN控制台,选择域名所在的产品线。

  2. 选择域名,单击操作列中的CDN服务有哪些特点

  3. 在自助配置界面选择:访问控制-URL鉴权,单击鉴权URL计算器
    CDN服务有哪些特点

  4. 选择鉴权模式。
    CDN服务有哪些特点

参数 描述
模式A http://$domain/$time/$key/$uri
模式B http://$domain/$key/$time/$uri
模式C http://$domain/$uri?key=$key&time=$time
模式D http://$domain/$uri?time=$time&key=$key

参数说明:

  • http和https请求都会进行校验。
  • $domain: 加速域名
  • $time:时间参数值,用于校验是否过期。 时间格式必须符合“时间格式”的配置值。 如果校验过期,或者格式不符合设置的格式,都是校验失败。
  • $key:密钥参数值。网宿CDN会根据客户设置的“密钥计算方式”算一个密钥参数值,与请求URL的密钥参数值进行对比,如果不一致则鉴权失败。
  • time: 模式C和D,需要携带参数名和参数值。时间参数名,默认为time。可配。
  • key: 模式C和D,需要携带参数名和参数值。密钥参数名,默认为key。可配。
  1. 填写要形成加密URL的原始URL。
    CDN服务有哪些特点
    说明:
    不以“http://”或“https://”开头,仅配置URL中的URI部分。例如:完整的原始URL为:http://www.test.com/browse/index.html,则配置内容为:/browse/index.html。

  2. 配置密钥参数$key的计算方式。
    CDN服务有哪些特点
    CDN服务有哪些特点

参数 描述
自定义加密串($ourkey) 计算密钥字段$key的参数之一,加密串字符不能包含冒号。
密钥计算参数 配置鉴权URL中密钥字段$key的计算参数,默认采用md5的计算方式。参数顺序不同,算出来的$key值不同。其中:
  • $uri: 请求URL中域名后问号前的部分,不包含域名和问号参数。例如,完整URL为:http://www.test.com/browse/index.html?a=1, 则参与计算MD5的URI为/browse/index.html
  • $ourkey:“自定义加密串($ourkey)”的配置值
  • $time:鉴权URL中时间字段的值。该时间字段必须符合 “时间格式”选择的格式。
若有其他参数想纳入$key的计算值,或需要采用非md5的其他计算方式,请联系技术支持配置。
  1. 配置时间参数$key的格式和有效时间。
    CDN服务有哪些特点
    CDN服务有哪些特点
参数 描述
时间格式 鉴权URL中时间字段的格式,五选一,包括:
  • 十进制Unix时间戳
  • 十六进制Unix时间戳
  • 毫秒级别的Unix时间戳
  • YYYYMMDDHHMMSS
  • YYYYMMDDHHMM
有效时间(秒) 配置有效时间,单位为秒。有三种配置方式:
  • 配置一个值,必须>=0,表示有效期上限。例如,有效期为时间戳后一分钟,则配置为60
  • 配置两个值,分别表示过期的下限和上限。例如,有效期为时间戳前一分钟到时间戳后一分钟,则应该配置-60,60,第一个值必须<=0,后一个值必须>=0,两个值以逗号隔开。
  • 配置为-,则表示不校验是否过期。
  1. 配置密钥参数名和时间参数名。(只有模式C和D才需要配置)
    CDN服务有哪些特点

  2. 点击“生成”,则可以把原始URL加密成鉴权URL,并计算出过期时间。

配置示例

1. A模式
CDN服务有哪些特点
说明:

  • http和https请求都会被鉴权
  • 此计算器的过期时间,为点击“生成”时的本地时间加上有效时间。 实际CDN校验时,是接收到请求时CDN节点的时间加上配置的有效时间。
  • B模式同理,AB模式的差异在于key和time的位置不同。

2. C模式
CDN服务有哪些特点
说明:

  • http和https请求都会被鉴权
  • 此计算器的过期时间,为点击“生成”时的本地时间加上有效时间。 实际CDN校验时,是接收到请求时CDN节点的时间加上配置的有效时间。
  • C模式同理,CD模式的差异在于key和time的位置不同。
  • 如上图所示,原始URL中携带两个问号参数a=1&b=2。 生成的鉴权URL默认将非鉴权参数置于末尾,为:http://$domain/browse/index.html?key=0c9f17a48c7dac72345a0fe9c2e8cf84&time=1617095687&a=1&b=2。 但实际鉴权过程中,非鉴权参数不会影响鉴权,如下3条鉴权URL也可以鉴权通过:
    http://$domain/browse/index.html?&a=1&b=2&key=0c9f17a48c7dac72345a0fe9c2e8cf84&time=1617095687。
    http://$domain/browse/index.html?key=0c9f17a48c7dac72345a0fe9c2e8cf84&a=1&b=2&time=1617095687。
    http://$domain/browse/index.html?&a=1&key=0c9f17a48c7dac72345a0fe9c2e8cf84&time=1617095687&b=2。

代码示例

如下代码示例,仅用于示范校验参数的生成过程。

import md5 from '@/utils/md5' // md5加密
import dateFunc from '@/utils/dateFunc' // 自定义时间相关操作库方法
 
// 根据时间格式转换时间
export const formatTime = function (time, type) {
  if (!time || !type) return ''
  let result = ''
  switch(type) {
    case 'DECIMAL_UNIX': {
      // 十进制Unix时间戳
      const _time = time.toString()
      result = parseInt(_time.slice(0, _time.length - 3), 10).toString(10)
      break
    }
    case 'HEX_UNIX': {
      // 十六进制Unix时间戳
      const _time = time.toString()
      result = parseInt(_time.slice(0, _time.length - 3), 10).toString(16)
      break
    }
    case 'MILLISECOND_UNIX': {
      // 毫秒级别的Unix时间戳
      result = time.toString()
      break
    }
    case 'SECOND_PATTERN': {
      //YYYYMMDDHHMMSS
      //时间格式转换
      result = dateFunc.getDateByformat(time, 'yyyyMMddHHmmss')
      break
    }
    case 'MINUTE_PATTERN': {
      // YYYYMMDDHHMM
      //时间格式转换
      result = dateFunc.getDateByformat(time, 'yyyyMMddHHmm')
      break
    }
  }
  return result
};
 
/**
 * data :object
 * @prototype {string} domain // 域名
 * @prototype {string} uri // 访问路径
 * @prototype {string} customEncryptionStr // 自定义加密串
 * @prototype {string} timestampPattern // 时间格式 ['DECIMAL_UNIX', 'HEX_UNIX', 'MILLISECOND_UNIX', 'SECOND_PATTERN', 'MINUTE_PATTERN']
 * @prototype {string} keyCalculationMode // 密钥计算参数 $time、$key、$ourkey 组合
 * @prototype {string} keyParam // 密钥参数名
 * @prototype {string} timeParam // 时间参数名
 */
// 鉴权模式A
export const modeA_auth = function (data) {
  const now = new Date().getTime()
  let template = 'http://$domain/$time/$key/$uri'
  // 域名
  template = template.replace(/\$domain/g, data.domain)
  // 访问路径
  const _uri = data.uri.split('?')
  template = template.replace(/\/\$uri/g, _uri[0])
  // 自定义加密串
  // 时间格式 - 格局时间格式获取时间
  // TODO 确认十进制、毫秒级
  const formatNow = formatTime(now, data.timestampPattern)
  template = template.replace(/\$time/g, formatNow)
  // 密钥计算参数
  let keyTemplate = data.keyCalculationMode
  keyTemplate = keyTemplate.replace(/\$uri/g, _uri[0])
  keyTemplate = keyTemplate.replace(/\$time/g, formatNow)
  keyTemplate = keyTemplate.replace(/\$ourkey/g, data.customEncryptionStr)
  template = template.replace(/\$key/g, md5(keyTemplate))
  // 访问路径参数
  if (_uri[1]) {
    template += `?${_uri[1]}`
  }
  return template
};
 
// 鉴权模式B
export const modeB_auth = function (data) {
  const now = new Date().getTime()
  let template = 'http://$domain/$key/$time/$uri'
  // 域名
  template = template.replace(/\$domain/g, data.domain)
  // 访问路径
  const _uri = data.uri.split('?')
  template = template.replace(/\/\$uri/g, _uri[0])
  // 自定义加密串
  // 时间格式 - 格局时间格式获取时间
  // TODO 确认十进制、毫秒级
  const formatNow = formatTime(now, data.timestampPattern)
  template = template.replace(/\$time/g, formatNow)
  // 密钥计算参数
  let keyTemplate = data.keyCalculationMode
  keyTemplate = keyTemplate.replace(/\$uri/g, _uri[0])
  keyTemplate = keyTemplate.replace(/\$time/g, formatNow)
  keyTemplate = keyTemplate.replace(/\$ourkey/g, data.customEncryptionStr)
  template = template.replace(/\$key/g, md5(keyTemplate))
  // 访问路径参数
  if (_uri[1]) {
    template += `?${_uri[1]}`
  }
  return template
};
 
// 鉴权模式C
export const modeC_auth = function (data) {
  const now = new Date().getTime()
  let template = 'http://$domain/$uri?key=$key&time=$time'
  // 域名
  template = template.replace(/\$domain/g, data.domain)
  // 访问路径
  const _uri = data.uri.split('?')
  template = template.replace(/\/\$uri/g, _uri[0])
  // 自定义加密串
  // 时间格式 - 格局时间格式获取时间
  // TODO 确认十进制、毫秒级
  const formatNow = formatTime(now, data.timestampPattern)
  template = template.replace(/\$time/g, formatNow)
  // 密钥计算参数
  let keyTemplate = data.keyCalculationMode
  keyTemplate = keyTemplate.replace(/\$uri/g, _uri[0])
  keyTemplate = keyTemplate.replace(/\$time/g, formatNow)
  keyTemplate = keyTemplate.replace(/\$ourkey/g, data.customEncryptionStr)
  template = template.replace(/\$key/g, md5(keyTemplate))
  // 密钥参数名
  template = template.replace(/key(?=(\=))/g, data.keyParam || 'key')
  // 时间参数名
  template = template.replace(/time(?=(\=))/g, data.timeParam || 'time')
  // 访问路径参数
  if (_uri[1]) {
    template += `&${_uri[1]}`
  }
  return template
};
 
// 鉴权模式D
export const modeD_auth = function (data) {
  const now = new Date().getTime()
  let template = 'http://$domain/$uri?time=$time&key=$key'
  // 域名
  template = template.replace(/\$domain/g, data.domain)
  // 访问路径
  const _uri = data.uri.split('?')
  template = template.replace(/\/\$uri/g, _uri[0])
  // 自定义加密串
  // 时间格式 - 格局时间格式获取时间
  // TODO 确认十进制、毫秒级
  const formatNow = formatTime(now, data.timestampPattern)
  template = template.replace(/\$time/g, formatNow)
  // 密钥计算参数
  let keyTemplate = data.keyCalculationMode
  keyTemplate = keyTemplate.replace(/\$uri/g, _uri[0])
  keyTemplate = keyTemplate.replace(/\$time/g, formatNow)
  keyTemplate = keyTemplate.replace(/\$ourkey/g, data.customEncryptionStr)
  template = template.replace(/\$key/g, md5(keyTemplate))
  // 密钥参数名
  template = template.replace(/key(?=(\=))/g, data.keyParam || 'key')
  // 时间参数名
  template = template.replace(/time(?=(\=))/g, data.timeParam || 'time')
  // 访问路径参数
  if (_uri[1]) {
    template += `&${_uri[1]}`
  }
  return template
};
 
// 例子
/*
 const data = {
 domain: '5.5.5.5', // 域名
 uri: '/url/calcute?foo=bar', // 访问路径
 customEncryptionStr: 'private', // 自定义加密串
 timestampPattern: 'DECIMAL_UNIX', // 时间格式 ['DECIMAL_UNIX', 'HEX_UNIX', 'MILLISECOND_UNIX', 'SECOND_PATTERN', 'MINUTE_PATTERN']
 keyCalculationMode: '$key$time$ourkey' // 密钥计算参数 $time、$key、$ourkey 组合
}
 
console.log('MODEA_AUTH: ', modeA_auth(data))
console.log('MODEA_AUTH: ', modeB_auth(data))
*/