laravel-api-authlaravelAPI认证这是一个laravelAPI认证包,laravel-api-auth采用密钥加密认证方式,只要客户端不反编译即可显示key,这种认证方式理论上是安全的(不管量子计算机的出现)。项目地址:github.com/96qbhy/laravel-api-authinstallcomposerrequire96qbhy/laravel-api-auth配置注册ServiceProvider:Qbhy\LaravelApiAuth\ServiceProvider::class,laravel5.5+版本不需要手动注册发布配置文件phpartisanvendor:publish--provider="Qbhy\LaravelApiAuth\ServiceProvider"在App\Http\Kernal中注册中间件protected$routeMiddleware=['api_auth'=>Qbhy\LaravelApiAuth\LaravelApiAuthMiddleware::class,//other...];添加rolephpartisanapi_auth然后在config/api_auth.php中的roles数组中按照格式添加access_key和secret_key。'roles'=>['{access_key}'=>['name'=>'{role_name}',//角色名,如android'secret_key'=>'{secret_key}',],],自定义签名config/api_auth.php中的method(optional)encrypting可以修改为自定义签名函数,会传入三个参数:key:$secret_key,随机字符串:$echostr,timestamp:$timestamp,返回签名后的字符串。该函数默认为:/***@param$secret_key*@param$echostr*@param$timestamp*@returnstring*/functionencrypting($secret_key,$echostr,$timestamp){returnmd5($secret_key.$echostr.$timestamp);}自定义签名验证规则(可选)config/api_auth.php中的规则可以修改为自定义验证函数,会传入三个参数:key:$secret_key,customerSidesignature:$signature,server签名:$server_signature,必须返回布尔值。该函数默认为:/***@param$secret_key*@param$signature*@param$server_signature*@returnbool*/functionrule($secret_key,$signature,$server_signature){return$signature===$server_signature;}自定义错误处理(可选)config/api_auth.php中的error_handler可以修改为自定义错误处理函数,会传入两个参数:request:$request,errorcode:$code。该函数默认为:/***@paramRequest$request*@paramint$code*@return\Illuminate\Http\JsonResponse*/functionerror_handler($request,$code){returnresponse()->json(['msg'=>'Forbidden','code'=>$code],403);}$code可能是以下值之一:LaravelApiAuthMiddleware::LACK_HEADER->缺少标头。LaravelApiAuthMiddleware::ACCESS_KEY_ERROR->access_key错误。LaravelApiAuthMiddleware::SIGNATURE_ERROR->签名错误。LaravelApiAuthMiddleware::SIGNATURE_LAPSE->签名无效,客户端签名时间与服务端签名时间差值超过设置的超时值。LaravelApiAuthMiddleware::SIGNATURE_REPETITION->签名重复,同一个签名在指定时间内出现两次或以上。Route::get('api/example',function(Request$request){//$request->get('client_role');//todo...})->middleware(['api_auth']);\\orRoute::group(['middleware'=>'api_auth'],function(){//路由...});验证通过后,$request会增加一个client_role字段,即客户端的RoleName。前端从'axios'导入axios;constaccess_key='{access_key}';//服务器生成的access_keyconstsecret_key='{secret_key}';//服务器生成的secret_keyconsttimestamp=Date.parse(newDate())/1000;//获取时间戳constechostr='asldjaksdjlkjgqpojg64131321';//自己生成随机字符串functionencrypting(secret_key,echostr,timestamp){returnmd5(secret_key+echostr+timestamp);//md5库自我介绍}constrequestConfig={headers:{"api-signature":encrypting(secret_key,echostr,timestamp),"api-echostr":echostr,"api-timestamp":timestamp,"api-access-key":access_key}};axios.post('/api/example',{},requestConfig).then(res=>{//todo});这个例子是web前端的一个例子。其他客户也是如此。生成签名并带上指定的参数。可以正常要求。通过自定义签名方式和自定义验证方式,可以使用其他加密方式进行签名,比如哈希等加密算法。更多定制,可以直接复制Qbhy\LaravelApiAuth\LaravelApiAuthMiddleware中间件,自己修改。如果您有任何问题,请打开一个问题。96qbhy.com96qbhy@gmail.com
