HTTP 请求头
HTTP 请求头中各参数说明如下:
名称 | 位置 | 是否必选 | 说明 |
x-mg-traceid | 请求/响应 | 是 | 请求响应 ID,用于跟踪异常请求调用。 |
x-mg-secretid | 请求 | 是 | 授权的 SecretID,用于加签。开启密钥对鉴权时需要。 |
x-mg-alg | 请求/响应 | 否 | 加密算法。开启密钥对鉴权时需要。 0:hmac_md5 1:hmac_sha_1 2:hmac_sha_256 3:hmac_sha_512 |
x-mg-sign | 请求/响应 | 否 | 签名值。开启密钥对鉴权时需要。 |
x-mg-nonce | 请求/响应 | 否 | 随机数。开启密钥对鉴权时需要。 |
x-mg-code | 响应 | 是 | 响应码。 |
签名算法
算法列表
Hmac_MD5
HMAC_SHA_1
HMAC_SHA_256
HMAC_SHA_512
生成规则
digetValue = (x-mg-noce)+secretId+secretKey
signValue = Base64String(签名算法(secretKey, digetValue ),"utf-8")
案例说明
签名算法:hmac_md5
secretId:hKhATL/DHVXXXXgeROMrrQ==
secretKey:+t9tTMTXXXXUcE+RKOleg==
x-mg-noce:D7pAR5fqXXXXx1yacuVzdO
digetValue:D7pAR5fqXXXXx1yacuVzdOhKhATL/DHVXXXXgeROMrrQ==+t9tTMTXXXXXUcE+RKOleg==
signValue:FE6nLWwYBDXXXXU2CVtFndUBoyg=
校验规则
将请求头中的 x-mg-sign 与服务端根据签名生成规则计算的 signValue 进行比对,判断是否通过鉴权。
代码实现
Java 代码:
/*** 生成签名** @param nonce 随机字符串* @param secretId 密钥 ID* @param secretKey 密钥值* @param algType 签名算法 {@link AlgType}*/public static String generate(String nonce, String secretId, String secretKey, AlgType algType) {String digestValue = nonce + secretId + secretKey;byte[] serverSignBytes;switch (algType) {case HMAC_MD5:serverSignBytes = HmacUtils.hmacMd5(secretKey, digestValue);break;case HMAC_SHA_1:serverSignBytes = HmacUtils.hmacSha1(secretKey, digestValue);break;case HMAC_SHA_256:serverSignBytes = HmacUtils.hmacSha256(secretKey, digestValue);break;case HMAC_SHA_512:serverSignBytes = HmacUtils.hmacSha512(secretKey, digestValue);break;default:throw new UnsupportedException("不支持的鉴权算法: " + algType);}String signValue = Base64.encodeBase64String(serverSignBytes);if (logger.isDebugEnabled()) {logger.debug("签名明文:{},签名密文:{}", digestValue, signValue);}return signValue;}public static void main(String[] args) {String secretId = "hKhATL/DHVXXXXgeROMrrQ==";String secretKey = "+t9tTMTXXXXUcE+RKOleg==";String nonce = "D7pAR5fqXXXXx1yacuVzdO";AlgType algType = AlgType.HMAC_SHA_1;System.out.println(SignUtil.generate(nonce, secretId, secretKey, algType));}
Python 代码:
# -*- coding: utf-8 -*-"""使用 SHA1 算法生成签名,入参为 SecretId 和 SecetKey"""import sysfrom hashlib import sha1import stringimport randomimport hmacimport base64import uuidseed=['1','2','3','4','5','6','7','8','9','0','a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z','A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z']nonce=string.join(random.sample(seed,22)).replace(" ","")signstr=nonce+sys.argv[1]+sys.argv[2]local_sign_seed = hmac.new(sys.argv[2],signstr , sha1).digest()sign = base64.b64encode(local_sign_seed)print ""print "generate local sign: " +signprint ""print "=== http request headers as followed === "print "x-mg-nonce: "+nonceprint "x-mg-secretid: "+sys.argv[1]print "x-mg-traceid: "+str(uuid.uuid1())print "x-mg-alg: 1"print "x-mg-sign: "+sign
使用说明
生成签名
python gen_sign.py {secretId} {secretKey}
{secretId} 替换成密钥 ID,{secretKey} 替换成密钥 KEY,示例如下:
python gen_sign.py hKhATL/DHVXXXXgeROMrrQ== +t9tTMTXXXXUcE+RKOleg==
输出内容:
generate local sign: FE6nLWwYBDXXXXU2CVtFndUBoyg==== http request headers as followed ===x-mg-nonce: D7pAR5fqXXXXx1yacuVzdOx-mg-secretid: hKhATL/DHVXXXXgeROMrrQ==x-mg-traceid: 8a237eba-71b2-11e9-acee-5254001d2da0x-mg-alg: 1x-mg-sign: FE6nLWwYBDXXXXU2CVtFndUBoyg=
curl 方式测试
测试无鉴权的 API:
curl -X {GET} -H 'x-mg-traceid:71b2-11e9-acee-5254001-8a237eba' http://{gatewayIp}:{gatewayPort}/{groupContext}/{namespaceName}/{serviceName}/{apiPath}
测试鉴权的 API:
curl -X {POST} -H 'content-type: application/json;charset=utf-8' -H 'x-mg-secretid:{secretid}' -H 'x-mg-sign: {sign}' -H 'x-mg-nonce: {nonce}' -H 'x-mg-alg:1' -H 'x-mg-traceid:71b2-11e9-acee-5254001-8a237eba' -d '{具体的报文}' http://{gatewayIp}:{gatewayPort}/{groupContext}/{namespaceName}/{serviceName}/{apiPath}
说明
{ } 中的参数请根据实际内容替换。