trappistes / api-sign
Laravel API 签名校验
Installs: 27
Dependents: 0
Suggesters: 0
Security: 0
Stars: 1
Watchers: 1
Forks: 0
Open Issues: 0
pkg:composer/trappistes/api-sign
README
介绍
Laravel/Lumen API 签名校验包
安装教程
Laravel
首选安装包
composer require trappistes/api-sign
发布资源(非必须),仅在需要调整表数据结构时使用
php artisan vendor:publish
执行迁移
php artisan migrate
注册路由中间件,在 app/Http/Kernel.php 中添加
protected $routeMiddleware = [
     'sign' => \Trappistes\ApiSign\Middlewares\SignatureValidate::class
];
Lumen
首选安装包
composer require trappistes/api-sign
需要手动注册服务,在 bootstrap/app.php 中添加
$app->register(\Trappistes\ApiSign\SignatureServiceProvider::class);
发布资源(非必须),仅在需要调整表数据结构时使用
将 database/migrations/create_access_keys_table.php 复制到 database/migrations 目录下
执行迁移
php artisan migrate
注册路由中间件, 在 bootstrap/app.php 中添加
$app->routeMiddleware([
   'sign' => \Trappistes\ApiSign\Middlewares\SignatureValidate::class
]);
使用
请求参数
| 参数名 | 类型 | 是否必须 | 描述 | 
|---|---|---|---|
| Signature-Access-Key | string | 是 | 应用Key | 
| Signature-Method | string | 否 | 签名类型,默认:md5(支持md5,hmacsha256) | 
| Signature-Nonce | string | 是 | 一次性验证随机字符串,长度1-32位任意字符(建议使用时间戳+随机字符串) | 
| Signature-Timestamp | string | 是 | 签名时间戳,有效期600s($ttl参数控制) | 
| Signature-String | string | 是 | 签名字符串,参考签名规则 | 
业务参数
如果API本身有业务级的参数也必须传入。如:http://endpoint.com/api/users?group_id=1&active=1&foo=bar... group_id=1 active=1 foo=bar 等query_param需要进行签名。
签名方法
- 对除
sign参数外的所有API请求参数(包括公共参数access_key,method,nonce,timestamp,(不含sign-string)和业务请求参数),根据参数名称的ASCII码表的顺序排序。 如:foo=1, bar=2, foo_bar=3, foobar=4排序后的顺序是bar=2, foo=1, foo_bar=3, foobar=4; - 将排序好的参数名和参数值拼装在一起,根据上面的示例得到的结果为:
bar2foo1foo_bar3foobar4; - 把拼装好的字符串采用utf-8编码,使用签名算法对编码后的字符串进行摘要; 如:
md5(bar2foo1foo_bar3foobar4 + secret),hash_hmac('sha256', bar2foo1foo_bar3foobar4 + secret, secret); - 将摘要得到的字节结果使用大写表示。如:
strtoupper($sign_string); 
后端校验方法
在需要校验的路由上使用中间件校验
Laravel
Route::resource('user',UserController::class)->middleware('sign');
Lumen
$router->get('admin/profile','AdminController@showProfile'])->middleware('sign')
key & secret 管理(略)CURD自行实现
Trappistes\ApiSign\Models\AccessKey;