Files
sign-doc/csharp/README.md

181 lines
4.6 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# API签名工具 - C#实现
本目录包含API签名机制的C#语言实现,提供了签名计算与验证的完整功能。
## 功能特点
- 支持多种签名算法MD5, SHA1, SHA256, HMAC-SHA256
- 支持自定义签名参数名称
- 支持URL参数签名
- 内置防重放攻击机制(时间戳+nonce
- 跨平台(.NET Standard 2.0 兼容)
- 提供命令行工具进行测试
- 无外部依赖,仅使用.NET标准库
## 项目结构
根据实际项目文件结构:
```plaintext
csharp/
├── src/
│ ├── ApiSigner/
│ │ ├── ApiSigner.cs # 签名工具实现
│ │ ├── ApiSigner.csproj # 项目文件
│ │ ├── SignatureAlgorithm.cs # 签名算法定义
│ │ ├── SignOptions.cs # 签名配置
│ │ └── SignVerifyResult.cs # 验证结果类型
│ │
│ ├── ApiSigner.Cli/
│ │ ├── ApiSigner.Cli.csproj # 命令行项目文件
│ │ └── Program.cs # 命令行入口
│ │
│ └── ApiSigner.sln # 解决方案文件
```
## 使用方法
### 构建项目
```bash
dotnet build src/ApiSigner.sln
```
### 运行命令行工具
```bash
dotnet run --project src/ApiSigner.Cli/ApiSigner.Cli.csproj [选项]
```
### 命令行选项
| 选项 | 描述 |
|------|------|
| `-a, --algorithm` | 签名算法: MD5, SHA1, SHA256, HMAC-SHA256 |
| `-u, --url` | API基础URL |
| `-p, --param` | 请求参数格式为key=value可多次使用 |
| `-k, --key` | 访问密钥ID |
| `-s, --secret` | 密钥 |
| `-c, --channel` | 合作渠道方ID |
| `-h, --help` | 显示帮助信息 |
### 常用命令示例
**基本用法**
```bash
dotnet run --project src/ApiSigner.Cli/ApiSigner.Cli.csproj
```
**自定义参数**
```bash
dotnet run --project src/ApiSigner.Cli/ApiSigner.Cli.csproj \
-u "https://api.example.com/user/info" \
-p "userId=12345" -p "action=getInfo" \
-k "YOUR_ACCESS_KEY" \
-s "YOUR_SECRET_KEY" \
-c "3"
```
**指定签名算法**
```bash
dotnet run --project src/ApiSigner.Cli/ApiSigner.Cli.csproj -a SHA256
```
**帮助信息**
```bash
dotnet run --project src/ApiSigner.Cli/ApiSigner.Cli.csproj --help
```
### API接口测试实例
使用真实API接口进行测试
```bash
# 未签名的API调用测试 - 返回错误
curl "https://api-v1.sound-force.com:8443/p/album/single/media-url?channelId=3&singleId=381980"
# 返回: {"code":400,"data":null,"msg":"Missing AccessKeyId","success":false}
# 生成访问https://api-v1.sound-force.com:8443/p/album/single/media-url的签名URL
dotnet run --project src/ApiSigner.Cli/ApiSigner.Cli.csproj \
-a MD5 \
-u "https://api-v1.sound-force.com:8443/p/album/single/media-url" \
-p "singleId=381980" \
-k "YOUR_ACCESS_KEY" \
-s "YOUR_SECRET_KEY" \
-c "3"
# 使用curl测试API接口
signedUrl=$(dotnet run --project src/ApiSigner.Cli/ApiSigner.Cli.csproj \
-a MD5 \
-u "https://api-v1.sound-force.com:8443/p/album/single/media-url" \
-p "singleId=381980" \
-k "YOUR_ACCESS_KEY" \
-s "YOUR_SECRET_KEY" \
-c "3" | grep -A 1 "签名后的URL:" | tail -n 1)
curl -v "$signedUrl"
```
请注意:
- 替换`YOUR_ACCESS_KEY`为实际的访问密钥ID
- 替换`YOUR_SECRET_KEY`为实际的密钥
- 示例使用的渠道ID为`3`,请根据实际情况调整
使用有效的密钥和签名后API接口将返回成功响应(状态码200)并提供媒体URL数据。
### 代码集成
```csharp
using SoundForce.ApiSigner;
// 创建签名选项
var options = new SignOptions { Algorithm = SignatureAlgorithm.Md5 };
// 创建签名工具
var signer = new ApiSigner(options);
// 准备请求参数
var parameters = new Dictionary<string, string>(StringComparer.OrdinalIgnoreCase)
{
["singleId"] = "381980"
};
// 执行签名
var signedParams = signer.SignRequest(
parameters,
"YOUR_ACCESS_KEY",
"YOUR_SECRET_KEY",
"3"
);
// 或签名URL
var signedUrl = signer.SignUrl(
"https://api-v1.sound-force.com:8443/p/album/single/media-url",
parameters,
"YOUR_ACCESS_KEY",
"YOUR_SECRET_KEY",
"3"
);
```
### 环境变量
该工具支持从`.env`文件加载以下配置:
- `ACCESS_KEY_ID`: 访问密钥ID
- `SECRET_KEY`: 密钥
- `CHANNEL_ID`: 渠道ID
- `SIGN_ALGORITHM`: 签名算法
- `API_BASE_URL`: API基础URL
## 注意事项
1. 在生产环境中应该妥善保管SecretKey不要硬编码在代码中
2. 服务端需要自行实现nonce存储与验证以防止重放攻击
3. 时间戳验证需要考虑服务器与客户端之间可能存在的时间差
4. 默认情况下,命令行工具从`.env`文件或环境变量读取配置