接口鉴权

2024.04.15 16:46:36

    获取安全凭证

    易盾行为式验证码服务使用签名认证方法对接口进行鉴权,所有接口每一次请求都需要包含签名信息(signature 参数),以验证用户身份,防止身份被盗用和数据被恶意篡改。
    在第一次使用 API 之前,需获取安全凭证,安全凭证包括SecretId和SecretKey,SecretId是用于标识API调用者的身份,SecretKey是用于计算签名字符串的秘钥。SecretKey必须严格保管,避免泄露。获取路径为【易盾官网 - 行为式验证码 - 服务管理 - 点击查看产品密钥】。

    生成签名参数 signature

    每次接口调用时,需要生成用于校验身份合法性的签名参数 signature,生成方法如下:

    1. 对所有请求参数(不包括 signature 参数),按照参数名ASCII码表升序顺序排序。如参数:foo=1, bar=2,foo_bar=3, baz=4 ,排序后的顺序是 bar=2, baz=4, foo=1, foo_bar=3;

    2. 将排序好的参数名和参数值对,拼装成字符串,格式为:key1value1key2value2…。根据上面示例,拼装结果为:bar2baz4foo1foo_bar3;

    3. 将安全凭证的secretKey,加到上一步拼装的参数字符串后面。根据上面示例,拼装结果为:bar2baz4foo1foo_bar3your_secretKey;

    4. 把 3 中的字符串,采用 UTF-8 编码,使用 MD5算法(128位长度)对字符串进行摘要计算,得到signature参数值(32位十六进制小写字符串)。

     

    示例代码

    签名生成示例代码:

    import java.nio.charset.StandardCharsets;
    import java.util.Arrays;
    import java.util.Map;
    
    // 注:您可以根据自己工程的实际情况,选择合适的辅助工具。
    // 依赖 Apache Commons Codec(commons-codec: commons-codec)
    import org.apache.commons.codec.digest.DigestUtils;
    // 依赖 Apache Commons Lang(org.apache.commons: commons-lang3)
    import org.apache.commons.lang3.ObjectUtils;
    import org.apache.commons.lang3.StringUtils;
    
    /**
     * 生成签名信息
     * @param secretKey 产品私钥
     * @param params 接口请求参数名和参数值map,不包括signature参数名
     */
    public static String genSignature(String secretKey, Map<String, String> params) {
        String[] paramNames = params.keySet().toArray(new String[0]);
        Arrays.sort(paramNames);
    
        StringBuilder sb = new StringBuilder();
        for (String name : paramNames) {
            String value = ObjectUtils.defaultIfNull(params.get(name), StringUtils.EMPTY);
            sb.append(name).append(value);
        }
    
        sb.append(secretKey);
    
        return DigestUtils.md5Hex(sb.toString().getBytes(StandardCharsets.UTF_8));
    }
    
    using System;
    using System.Text;
    using System.Collections.Generic;
    using System.Security.Cryptography;
    using System.Linq;
    
    // 注:通常,你会创建一个 Dictionary 对象作为 paramDict
    public static string GenSignature(string secretKey, IEnumerable<KeyValuePair<string, string>> paramDict)
    {
        StringBuilder sb = new StringBuilder();
        foreach (var param in paramDict.OrderBy(p => p.Key, StringComparer.Ordinal)) {
            var name = param.Key; 
            var value = param.Value ?? String.Empty;
            sb.Append(name).Append(value);
        }
    
        sb.Append(secretKey);
    
        using (MD5 md5 = MD5.Create())
        {
            var md5Bytes = md5.ComputeHash(Encoding.UTF8.GetBytes(sb.ToString()));
            return String.Concat(md5Bytes.Select(c => c.ToString("x2")));
        }
    }
    
    // 注:你可以根据自己工程的实际情况,选择合适的辅助工具。
    const crypto = require('crypto');
    
    var genSignature = function (secretKey, paramDict) {
        var sortedNames = Object.keys(paramDict).sort();
    
        var paramStr = '';
        for (var i=0; i<sortedNames.length; i++) {
            var name = sortedNames[i];
            paramStr += name + (paramDict[name] || '');
        }
    
        paramStr += secretKey;
    
        return crypto.createHash('md5')
            .update(paramStr, "UTF-8")
            .digest('hex');
    };
    
    #!/usr/bin/env python
    # -*- coding: utf-8 -*-
    import hashlib
    
    """生成签名信息
    Args:
        secret_key 产品私钥
        param_dict 接口请求参数,不包括signature参数
    """
    def gen_signature(secret_key, param_dict):
      param_str = ''.join([
        str(name) + str(param_dict[name] or '')
        for name
        in sorted(param_dict.keys())
        ])
    
      param_str += secret_key
    
      return hashlib.md5(param_str.encode("utf-8")).hexdigest()
    
    /**
     * 生成签名信息
     * $secret_key 产品私钥
     * $params 接口请求参数,不包括signature参数
     */
    function gen_signature($secret_key, $params) {
        ksort($params);
    
        $tmp_array = array_map(
            function ($value, $name) { return $name . ($value ?: ''); },
            $params,
            array_keys($params));
    
        $tmp_str = implode($tmp_array);
    
        $tmp_str .= $secret_key;
    
        return md5(mb_convert_encoding($tmp_str, "UTF-8"));
    }
    
    在线咨询 电话咨询:95163223 免费试用