网关鉴权签名示例
Go 语言版本
Java 语言版本
提示
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.79</version>
</dependency>
PHP 语言版本
Python 语言版本
C# 语言版本
using System;
using System.Collections.Generic;
using System.Security.Cryptography;
using System.Text;
using Newtonsoft.Json;
namespace Flow.Avata
{
public class AvataUitl
{
public static string apiSecret = "apiKey";
public static string apiKey = "apiSecret";
public static string domain = "https://apis.avata.bianjie.ai/v2";
/**
* 对请求参数进行签名处理
*
* @param path 请求路径,仅截取域名后及 Query 参数前部分,例:"/v2/accounts";
* @param query Query 参数,例:"key1=value1&key2=value2",需转为 Map 格式
* @param body Body 参数,例:"{\"count\": 1, \"operation_id\": \"random_string\"}",需转为 Map 格式
* @param timestamp 当前时间戳(毫秒),例:1647751123703
* @param apiSecret 应用方的 API Secret,例:"AKIDz8krbsJ5yKBZQpn74WFkmLPc5ab"
* @return 返回签名结果
*/
public static String signRequest(String path, Dictionary<String, Object> query, Dictionary<String, Object> body, long timestamp, String apiSecret)
{
SortedDictionary<String, Object> paramsMap = new SortedDictionary<String, Object>();
paramsMap.Add("path_url", path);
if (query != null)
{
foreach (var key in query)
{
paramsMap.Add("query_" + key.Key, key.Value);
}
}
if (body != null)
{
foreach (var key in body)
{
paramsMap.Add("body_" + key.Key, key.Value);
}
}
// 将请求参数序列化为排序后的 JSON 字符串
String jsonStr = JsonConvert.SerializeObject(paramsMap);
// 执行签名
String signature = sha256Sum(jsonStr + timestamp.ToString() + apiSecret);
return signature;
}
/**
* SHA256 摘要
*
* @param str
* @return
*/
private static String sha256Sum(String str)
{
SHA256 sha256Generator = SHA256.Create();
byte[] sha256HashBytes = sha256Generator.ComputeHash(Encoding.UTF8.GetBytes(str));
StringBuilder sha256StrBuilder = new StringBuilder();
foreach (byte @byte in sha256HashBytes)
{
sha256StrBuilder.Append(@byte.ToString("x2"));
}
return sha256StrBuilder.ToString();
}
/// <summary>From:www.uzhanbao.com
/// DateTime转换为13位时间戳(单位:毫秒)
/// </summary>
/// <param name="dateTime"> DateTime</param>
/// <returns>13位时间戳(单位:毫秒)</returns>
public static long DateTimeToLongTimeStamp(DateTime dateTime)
{
DateTime timeStampStartTime = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc);
return (long)(dateTime.ToUniversalTime() - timeStampStartTime).TotalMilliseconds;
//return 1657338317368;
}
/// <summary>
/// POST 请求示例
/// 创建链账户
/// </summary>
/// <returns></returns>
public static account Account(string name, string operation_id)
{
try
{
string path = "/v2/account";
string url = domain + path;
Dictionary<string, object> body = new Dictionary<string, object>();
body.Add("name", name);
body.Add("operation_id", operation_id);
long Timestamp = DateTimeToLongTimeStamp(DateTime.Now);
string Signature = signRequest(path, null, body, Timestamp, apiSecret);
Dictionary<string, string> header = new Dictionary<string, string>();
header.Add("X-Api-Key", apiKey);
header.Add("X-Timestamp", Timestamp.ToString());
header.Add("X-Signature", Signature);
string bodyJson = JsonConvert.SerializeObject(body);
string ret = HttpHelper.PostData(url, bodyJson, "application/json", header, null);
return JsonConvert.DeserializeObject<account>(ret);
}
catch (Exception e)
{
Console.WriteLine(e);
return null;
}
}
/// <summary>
/// 创建账号
/// </summary>
public class account
{
public accountData data { get; set; }
}
public class accountData
{
public string account { get; set; }
public string name { get; set; }
public string operation_id { get; set; }
}
}
Node.js 语言版本
修改于 2024-03-26 07:14:22