参考1. Api Authorized Signature Middleware for Laravel 5
以上两者内容几一致。
在lumen中使用
-
composer require havenshen/larsign
- bootstrap.php 增加如下内容:
$app->configure('larsign'); #声明路由中间件,当然你可以使用其他的比如globalMiddleWare $app->routeMiddleware([ 'auth.larsign' => \HavenShen\Larsign\HandleLarsign::class, ]); $app->register(HavenShen\Larsign\LarsignServiceProvider::class); #声明facade类 Larsign class_alias(\HavenShen\Larsign\LarsignFacade::class, 'Larsign');
- 声明了auth.larsign 中间件后,我们写一个闭包路由做验签测试,路由地址
#此接口需要验签访问 Route::group(['middleware' => ['auth.larsign']], function () { Route::get('/larsign', function () { return [ 'message' => 'done.' ]; }); });
- 调试 & 生成header Sign 接口
Route::get('/lar', function (\Illuminate\Http\Request $request) { #base64_encode会产生url不友好的符号,这里有safebased4encode,当然就有safebased4decode #这里临时测试上手,找了php.net base64_encode下的评论区也有相关函数,试了不爽; #回来在larsign包check sign 扒出此部分代码 #此方法如果客户端也引入了larsign,可以使用facade方式:Larsign::base64_urlSafeEncode($str) function urlsafe_b64encode($string) { $find = array('+', '/'); $replace = array('-', '_'); return str_replace($find, $replace, base64_encode($string)); } //'accessKey' => env('LARSIGN_ACCESS_KEY', 'Hi^fjhKJlIUKjuM'), // 'secretKey' => env('LARSIGN_SECRET_KEY', 'PlrNIaO'), $rawStr = "/larsign\n" . (time()+86400); //Base64 url safe encode $base64 = urlsafe_b64encode($rawStr); $sign = hash_hmac('sha1', $base64, config('larsign.secretKey'), true); $sign = urlsafe_b64encode($sign); //titching headerName Space AccessKey:sign:signingStrBase64UrlSafeEncode $headerName = config('larsign.headerName'); $accessKey = config('larsign.accessKey'); $larsignToken = "{$headerName} {$accessKey}:{$sign}:{$base64}"; //最终设置的header头,名称为$headerName ;值为$larsignToken $headerStr = $headerName . ':' . $larsignToken; dd(config('larsign'), $sign, $headerStr); });
- postman Test,先生成sign
- 请求需要验签接口 ,先错填header修正确再次请求 :